PHP多程式程式設計(3):多程式抓取網頁的演示

發表於2016-04-05

要理解這個部分的程式碼,請閱讀:

PHP多程式程式設計(一)

PHP多程式程式設計(二)管道通訊

我們知道,從父程式到子經常的資料傳遞相對比較容易一些,但是從子程式傳遞到父程式就比較的困難。

有很多辦法實現程式互動,在php中比較方便的是 管道通訊。當然,還可以通過 socket_pair 進行通訊。

首先是伺服器為了應對每一個請求要做的事情(傳送一個url 序列,url序列用t 分割。而結束標記是 n)

上面程式碼比較關鍵的一個部分是 read_ntitle,這個函式實現多執行緒的讀取標題。

程式碼如下:(為每一個url fork 一個執行緒,然後開啟管道 ,讀取到的標題寫入到管道里面去,主執行緒一直的在讀取管道資料,直到所有的資料讀取完畢,最後刪除管道)

上面程式碼中,還有一個函式read_title 比較有技巧。為了相容性,我沒有采用curl,而是直接採用socket 通訊。

在下載到 title 標籤後,就停止讀取內容,以節省時間。程式碼如下:

這裡,我只是檢測了 三種最常見的編碼。其他的程式碼都很簡單,這些程式碼都是測試用的,如果你要做這樣一個伺服器,一定要進行優化處理。特別是,要防止一次開啟太多的程式,你要做更多的處理。

很多時候,我們抱怨php 不支援多程式,實際上,php是支援多程式的。當然,沒有那麼多的程式通訊的選項,而多程式的核心就在於程式的通訊與同步。在web開發中,這樣的多執行緒基本上是不會使用的,因為有很嚴重的效能問題。要實現比較簡單的多程式,高負載,必須藉助其擴充套件。

相關文章