PHP多程序程式設計(三)多程序抓取網頁的演示

2021-09-08 07:26:53 字數 3080 閱讀 2899

要理解這個部分的**,請閱讀:

用 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並行抓取多個網頁內容的...