PHP多程式程式設計(一)

發表於2016-04-03

雖然PHP 中,多程式用的比較的少。但是畢竟可能是會用到了。我最近就遇到這樣一個問題,使用者提交幾百個url以後,要讀出這個url 中的標題。

當然,你不希望使用者等待的太久,10s 鍾應該給出個答案。但是,本身,你要獲取一個url 的標題,少的要 0.1s ,多的要好幾秒。

顯然,採用單個執行緒的方式是不行的。

 

我的第一個設計方案是這樣的:

1. 用我前面提供的程式碼提供一個簡單的伺服器:  http://www.cnblogs.com/niniwzw/archive/2009/09/27/1575002.html

這個伺服器的作用是:提供一個url,然後,就讀取標題。這裡,可以每次讀128個位元組,看看有沒有讀到title,如果讀到title了就停止讀了。

這樣可以省頻寬。

2. 在客戶端,同時開啟1百個 socket ,訪問這個伺服器。如果提供的url數目超過100,那麼就多次執行。

這個方案,基本上能夠滿足要求,讀比較快的網頁如:google.com 100次,也只要1s 左右。但是,通過測試,發現,有一定

的概率在開啟連結的時候被阻塞。(有時候會阻塞個1s左右,然後繼續往下open)可能開啟了太多的連結了,會出很大的問題。

當然,這是一個很差的解決方案:建立tcp 連結本身的消耗非常的大。因為可靠有序傳輸的要求,要維持一個資料結構,而且,系統還要開闢一定的快取給客戶端和伺服器端,

使用者快取資料。如果建立上百個連結,就可能佔用很大的記憶體。作為一個系統的服務,應該儘量的簡單,就是,我叫你做什麼事情,你做好以後,結果給我就可以了。

 

一般來說,PHP要進行多程式程式設計,比較常見的是:

1. 要進行大量的網路耗時的操作

2. 要做大量的運算,並且,系統有多個cpu,為了讓使用者有更快的體驗,把一個任務,分成幾個小任務,最後合併。

所以,應該儘量不要在呼叫的地方有太多複雜的邏輯,把邏輯內建在服務中。

 

我的第二個設計方案是這樣的:

同樣用上面的伺服器,只是,這個伺服器功能變了,接收不超過100個的url,然後開啟100個子執行緒,下載title。最後合併,返回給客戶端。

具體怎麼編寫這個伺服器,在下一個部分講。

這個一測試,發現效率高了很多。而且也十分的穩定。下載一百下google 大概 0.7s。基本上不會超過1s,而原來的那個方案,經常超過5s(20%的可能性)

當然,如果這樣的設計方案只是一個很簡單的解決方案。如果有很多人使用你的服務的情況下,肯定不能這樣做。

PHP做企業級別的開發,一個比較複雜的問題,就是記憶體怎麼處理。還有就是往往採用陣列 會引起記憶體急劇膨脹。一般,陣列處理10萬條資料已經是極限,

在小網站開發很少會用到一次讀取如此大的資料量,要是遇到了,最好通過C 擴充套件進行解決,否則,一次會損耗 幾百M 的記憶體,10個人用就拖死你。

相關文章