作者 主題: 關於 PHP 的多執行緒  (閱讀 10511 次)

0 會員 與 1 訪客 正在閱讀本文。

梁楓

  • 俺是博士!
  • *****
  • 文章數: 6220
    • 檢視個人資料
關於 PHP 的多執行緒
« 於: 2004-05-03 07:16 »
有人知道如何在PHP 同一個scripts中同時執行語多資料嗎?

我現在有一個程式
第一步 讀取所有客戶資料
第二步 將所有資料處理,發出處理通知

我的第二步需要可以同時多個一起處理
程式處理本身很簡單,所以沒有效率問題,但是程式所需要等待接受的資訊會比較久
因為要定時回報,如果同時客戶數量比較多怕會拖長時間,造成回報時差太過誇張
並且各個客戶互相之間是沒有關系的。

有人有這個經驗嗎?能分享一下嗎?
感謝感謝...

螢火飛

  • 酷!學園 學長們
  • 活潑的大學生
  • ***
  • 文章數: 400
    • 檢視個人資料
    • http://firefly.idv.tw
關於 PHP 的多執行緒
« 回覆 #1 於: 2004-05-03 08:53 »
梁兄 :))
這個可能是您需要的:
http://tw2.php.net/manual/tw/function.pcntl-fork.php

Darkhero

  • 酷!學園 學長們
  • 俺是博士!
  • *****
  • 文章數: 3728
  • 性別: 男
    • 檢視個人資料
    • ㄚ凱隨手紀
關於 PHP 的多執行緒
« 回覆 #2 於: 2004-05-03 17:34 »
今天下午簡單的實作了一下 pcntl-fork 的程式...過程我放在我的 blog 上.
http://home.v-dark.net/~darkhero/blog/?blogid=1
希望我們的討論是為了把問題解決,而不是爭論誰對誰錯.
『灌水才是重點,發文只是順便』
『我寧可讓不會釣魚的工程師餓死,也不想讓會餓死的工程師去攪沉公司....』
Blog: http://blog.darkhero.net/
秘密基地: http://www.darkhero.net/comic/
目前服務的網站: http://www.libook.com.tw/

梁楓

  • 俺是博士!
  • *****
  • 文章數: 6220
    • 檢視個人資料
關於 PHP 的多執行緒
« 回覆 #3 於: 2004-05-05 23:38 »
螢火兄

謝謝,你說的經過這二天的測試確實是我要的
不過現在遇到另一個很頭大的問題
用fork確實達到了多執行緒的功能
不過在與mysql連接的時候,會一直造成錯誤
看起來像是多重mysql連線的問題

正在想辦法解決中

梁楓

  • 俺是博士!
  • *****
  • 文章數: 6220
    • 檢視個人資料
關於 PHP 的多執行緒
« 回覆 #4 於: 2004-05-21 02:02 »
經過這陣子的實作
以經差不多了解fork的方式

而在與MySQL實作的情況

fork 因為會產生大量的子程序
所以在與MySQL連線的時候,不能在程式開端一個start,結尾一個stop草草解決
最好是在fork後在start,fork結束前stop
否則很容易 Lost Mysql connect

因為我目前都以同時五百個客戶來測試(一次五百個,這五百個都有自己其它的查詢)
因此query都會超過100
而mysql 預設只接受100個query
因此需要在修改mysqld 的啟動參數...

for 報告完畢...
感謝各位大大...

kang812

  • 可愛的小學生
  • *
  • 文章數: 5
    • 檢視個人資料
關於 PHP 的多執行緒
« 回覆 #5 於: 2004-06-20 23:28 »
梁兄您好:
目前我實作 fork 遇到了些問題, 不知道您是否有遇到過?
下面的程式是我目前架構的範例:

代碼: [選擇]

while(1){

// SQL 語法 (從資料庫抓出數筆資料)
$PidNum=0;
while(data=mysql_fetch_object($dbrow)){

$PidNum++;
$pid[$PidNum] = pcntl_fork();
if ($pid[$PidNum] == -1) {
// 無法產生子程序
} else if ($pid[$PidNum]) {
} else {
// 這裡是放子程序執行的程式段
exit; // 結束子程序
}
}
   
// 將所有的子程序全部關閉
for ($i=1; $i<=count($pid); $i++){
pcntl_waitpid($pid[$i],&$status,0);
}
}


但是這樣的架構會有一個問題, 如果有其中一隻子程序還在執行他的程式段, 整隻程式必須等他做完之後才會關閉所有的子程序,然後在重新執行 SELECT 的動作.

如何才能讓他開完自己的子程序之後, 執行完畢之後自行關閉且不影響其他子程序呢???

ricky

  • 區域板主
  • 鑽研的研究生
  • *****
  • 文章數: 669
    • 檢視個人資料
    • Ricky 碎碎唸
關於 PHP 的多執行緒
« 回覆 #6 於: 2004-07-13 15:39 »
要不要試看看改用mysql_pconnect
用法跟mysql_connect一樣
不過差別在於
mysql_pconnect使用的是"持續式"的連線
當function收到connect之後會先在connection pool裡面找看看
是否有"已連線"的連線在裡面
如果有就直接用沒有的話才會真正的再去建立一條新的連線
這樣應該可以避免重複開啟多個連線
導致connect fail的情形
[/quote]
我的symfony作品:YOMOpets 寵物誌
有興趣可以一起來討論symfony喔
我的部落格:http://ricky.ez2.us/

梁楓

  • 俺是博士!
  • *****
  • 文章數: 6220
    • 檢視個人資料
關於 PHP 的多執行緒
« 回覆 #7 於: 2004-07-13 16:03 »
這個以經查過了
在實作的過程還是會有一樣的狀況 ^^

ricky

  • 區域板主
  • 鑽研的研究生
  • *****
  • 文章數: 669
    • 檢視個人資料
    • Ricky 碎碎唸
關於 PHP 的多執行緒
« 回覆 #8 於: 2004-07-13 16:43 »
看來得控制一下connection的數量了
採用semaphore可能也是個不錯的解決方法
http://tw.php.net/manual/tw/ref.sem.php
不過php的sem沒用過等一下去實驗看看
應該跟C的sem用法差不多吧
看看這樣能不能吧
$pid = pcntl_fork();
if ($pid == 0)
{
 //child fork
 $sem_id=sem_get($key,$Max_MySQL_Connect);//參數就看看說明吧
 sem_acquire($sem_id);//當semaphore數量達到$Max_MySQL_Connect上限時目前的process會被暫時block直到其他的process釋放semaphore才會繼續進行
 //這邊就開始處理mysql的查詢動作
 sem_release($sem_id);
}
我的symfony作品:YOMOpets 寵物誌
有興趣可以一起來討論symfony喔
我的部落格:http://ricky.ez2.us/

梁楓

  • 俺是博士!
  • *****
  • 文章數: 6220
    • 檢視個人資料
關於 PHP 的多執行緒
« 回覆 #9 於: 2004-07-13 18:13 »
後來確實是增加mysql connect數量(預設只有五百個,我大約需要十倍)
還有一些微調達到需要的效果