要理解這個部分的**,請閱讀:
用 socket 和 pcntl 實現乙個多程序伺服器(一)
php多程序程式設計(一)
php多程序程式設計(二)管道通訊
我們知道,從父程序到子經常的資料傳遞相對比較容易一些,但是從子程序傳遞到父程序就比較的困難。
有很多辦法實現程序互動,在php中比較方便的是 管道通訊。當然,還可以通過 socket_pair 進行通訊。
首先是伺服器為了應對每乙個請求要做的事情(傳送乙個url 序列,url序列用\t 分割。而結束標記是 \n)
function
clienthandle(
$msgsock
,$obj
)$nbuf
.=$buf;if
(substr
($nbuf,-
1) !="
\n") $nbuf
=trim
($nbuf
);if
($nbuf=='
quit')
if($nbuf=='
shutdown')
$url
=explode("
\t",$nbuf
);$nbuf=''
;$talkback
=serialize
(read_ntitle(
$url
));socket_write(
$msgsock
,$talkback
,strlen
($talkback
));debug(
"write to the client\n");
break;}
while
(true);}
上面**比較關鍵的乙個部分是 read_ntitle,這個函式實現多執行緒的讀取標題。
**如下:(為每乙個url fork 乙個執行緒,然後開啟管道 ,讀取到的標題寫入到管道裡面去,主線程一直的在讀取管道資料,直到所有的資料讀取完畢,最後刪除管道)
function
read_ntitle(
$arr)}
debug(
"read begin!\n
");
$data
=$pipe
->
read_all();
debug(
"read end!\n");
$pipe
->
rm_pipe();
return
parse_data(
$data);}
parse_data **如下,非常的簡單,就不說了。
function parse_data($data)
}ksort($new, sort_numeric);
return $new;
}
上面**中,還有乙個函式read_title 比較有技巧。為了相容性,我沒有採用curl,而是直接採用socket 通訊。
這裡,我只是檢測了 三種最常見的編碼。
其他的**都很簡單,這些**都是測試用的,如果你要做這樣乙個伺服器,一定要進行優化處理。特別是,要防止一次開啟太多的程序,你要做更多的處理。
很多時候,我們抱怨php 不支援多程序,實際上,php是支援多程序的。當然,沒有那麼多的程序通訊的選項,而多程序的核心就在於程序的通訊與同步。
在web開發中,這樣的多執行緒基本上是不會使用的,因為有很嚴重的效能問題。要實現比較簡單的多程序,高負載,必須借助其擴充套件。
posted @
2010-01-29 20:18
暮夏 閱讀(
...)
編輯收藏
php 多程序程式設計
第一步 php m 命令檢視php是否安裝pcntl 和 posix擴充套件,若沒有則安裝使用場景 1.要進行大量的網路耗時的操作 2.要做大量的運算,並且,系統有多個cpu,為了讓使用者有更快的體驗,把乙個任務,分成幾個小任務,最後合併。多程序常用函式 pcntl alarm 為程序設定乙個ala...
PHP多程序程式設計
php本身不支援多執行緒,多程序支援的也不是特別好,網上找到乙份多程序 寫了乙個測試程式簡單測了一下,可以執行,但是離上線還差得很遠。project signfork php多執行緒庫 file signfork.class.php class signfork if is array arg sp...
PHP多程序 4 內部多程序
說的都是只相容unix 伺服器的多程序,下面來講講在window 和 unix 都相容的多程序 這裡是泛指,下面的curl實際上是通過io復用實現的 通過擴充套件實現多執行緒的典型例子是curl,curl 支援多執行緒的抓取網頁的功能。這部分過於抽象,所以,我先給出乙個curl並行抓取多個網頁內容的...