php多線程功能是php5.3才真正的支持了,下面我就嘗試了pthreads功能的一個測試同時也發測試時發現了一些bug了,具體bug原因還無法解決看其它朋友有經驗嗎.
近日用PHP處理約7k條網絡數據,現有網絡情況下,耗時通常一秒一條,跑完整個程序大約近兩個小時.
由于跑一次數據的時間太長,因此計劃通過多個線程實現并行處理,我們可以通過pthreads擴展來實現真正的多線程,而不是常見的fsockopen來“模擬”。pthreads的官網介紹在這里:http://pthreads.org/
需要注意的是,如果嘗試用數組在線程間交換數據,你會失望的,因為php的數組本身不是線程安全的,正確的做法是繼承Stackable類,一個簡單的demo如下所示:
- <?php
- class storage extends Stackable {
- public function run(){}
- }
- class my extends Thread {
- public function __construct($storage) {
- $this->storage = $storage;
- }
- public function run(){
- $i = 0;//m.survivalescaperooms.com
- while(++$i < 10) {
- $this->storage[]=rand(0,1000);
- }
- $this->synchronized(function($thread){
- $thread->notify();
- }, $this);
- }
- }
- $storage = new storage();
- $my = new my($storage);
- $my->start();
- $my->synchronized(function($thread){
- $thread->wait();
- }, $my);
- var_dump($storage);
- ?>
上例如果$storage是array,那么dump出來的將是null,啟用多線程后,跑一次數據的時間可以壓縮到1000秒內,不到二十分鐘,已經在我的接受范圍內了.
最后發現一個自動加載BUG
線程的run方法可以繼承主線程的常量,函數定義,ini_set()和自動加載不能繼承,具體什么能繼承什么不能繼承沒找到相關文檔,只能自己摸索.
繼承過來的函數中只能進行一些基本操作,如果試圖new一個對象(比如PDO)然后返回這個對象就會導致進程意外終止,就目前來說基本不能用于生產環境.
新聞熱點
疑難解答