提到php多執行緒,網上的例子基本都是併發發起http請求,難道php多執行緒就只能幹這個嗎,搞笑。
於是,我寫了乙個使用多執行緒對100萬個數的排序,在測試的過程中發現了幾個問題,記錄一下。
php多執行緒只有在例項化的時候有機會傳入引數,於是,當我傳入陣列的時候,發現有點不對勁。
class test extends thread
public function run()
}$p = new test($fruit);
$p->start();
var_dump($p); // 為了檢視執行緒是否還在,如果執行緒內有錯誤的話,執行緒就會被 destroy
結果:
array(3)
object(volatile)#2 (3)
object(test)#1 (2)
["response"]=>
null
}
也就是說,在建構函式中,我傳入陣列,給屬性賦值的時候,就變成了 volatile 物件。
關於 volatile 物件,檢視官方文件:
2、修改run()方法
public function run()
結果:報錯
也就說,只有建構函式中初始化的屬性才配用上 volatile 物件 。。。。。。
3、修改run()方法
public function run()
結果:報錯
php fatal error: uncaught runtimeexception: threaded members previously set
to threaded objects are immutable, cannot overwrite data
也就說,建構函式中初始化的屬性還不能改動它。。。。。。。。。
4、修改run()方法
public function run()
結果:可行
array(3)
object(test)#1 (2)
["response"]=>
array(3)
}
對於 volatile 物件 ,懶得去研究,直接轉陣列就可以操作了啊。
5、修改run()方法
public function run()
結果:報錯,執行緒已終止
這就很無語了,莫名其妙嘛,於是嘗試這 thi
s−
>re
spon
se=(
arra
y)
this->response = (array)
this
−>re
spon
se=(
arra
y)data;
尼瑪,這樣可以,呵呵,沒搞懂。
注意點:
1.執行緒類的屬性不能直接進行雜湊表(陣列)操作,如:
//這樣是無效的
$this->var1["hello"] = "world";
//改為
$this->var1 = ["hello"=>"world"];
因為執行緒類屬性的賦值是通過序列化實現的,其本質是儲存了序列化資料,因此不支援php常用直接操作雜湊表(陣列)的操作
3.執行緒物件開闢了php的第二空間
執行緒在建立之後,無法訪問到父執行緒的變數,諸如$globals或global等用法都無法操作父執行緒的全域性變數,這應該是考慮到了執行緒安全的問題;
但是父執行緒卻能夠訪問子執行緒物件的內容;
php多執行緒
php socket 程式設計今天看到篇好的文章,把主要部分翻譯出來給大家一起分享,譯的不好,請悟見笑,如果有翻譯錯誤的地方請大蝦指出,小第隨時更正 contributed by icarus,c melonfire 序言 省略了,有時間再加上 讓我們以乙個簡單的例子開始 乙個接收輸入字串,處理並返...
PHP 多執行緒
php 5.3 以上版本,使用pthreads php擴充套件,可以使php真正地支援多執行緒。多執行緒在處理重複性的迴圈任務,能夠大大縮短程式執行時間。cd data tgz php 5.5.1 make clean make make install unzip pthreads master....
PHP多執行緒的實現(PHP多執行緒類)
通過web伺服器來實現php多執行緒功能。當然,對多執行緒有深入理解的人都知道通過web伺服器實現的多執行緒只能模仿多執行緒的一些效果,並不是真正意義上的多執行緒。但不管怎麼樣,它還是能滿足我們的一些需要的,在需要類似多執行緒的功能方面還是可以採用這個類。view source print?01.0...