PHP多線程編程中可以通過Thread,Worker的構(gòu)造方法傳遞變量到線程,也可以通過線程的public屬性或public方法實(shí)現(xiàn),經(jīng)研究發(fā)現(xiàn)都是通過serialize()和unserialize()實(shí)現(xiàn)傳遞,這樣就會(huì)造成幾個(gè)問題:
測(cè)試環(huán)境:OS: win7 64、PHP: 5.4.25 ts、pthreads: 0.1.0
1.性能問題
2.PDO等某些類型不能serialize所以就不能傳遞到線程,這兩個(gè)問題是能通過其他凡是解決的,解決方法仁者見仁智者見智.
另外.可以通過傳遞匿名函數(shù)到線程中.但是有個(gè)bug.匿名函數(shù)不能賦值給線程中的屬性.導(dǎo)致傳遞的匿名函數(shù)只能在線程的構(gòu)造方法中才能使用(call_user_fun*系列函數(shù)調(diào)用).
Thread屬性定義一定要注意必須在構(gòu)造方法中初始化,否則必定為null,__construct()和run()里面的代碼不在一個(gè)次元,如果屬性不是PHP標(biāo)量在run()中不能修改,例如構(gòu)造方法中初始化一個(gè)對(duì)象,然后run()中修改對(duì)象屬性不會(huì)生效.
正確寫法如下:
- abstract class Task extends Thread {
- private $finished;
- public $terminated;
- protected $id;
- public $terminate;
- public function __construct($id) {
- $this->id = $id;
- $this->terminated = true;
- $this->finished = false;
- $this->terminate = false;
- }
- }
錯(cuò)誤寫法如下:
- abstract class Task extends Thread {
- private $finished=false;
- public $terminated=false;
- protected $id;// m.survivalescaperooms.com
- public $terminate=false;
- public function __construct($id) {
- $this->id = $id;
- }
- }
這樣也是錯(cuò)的,無論stdClass還是數(shù)組,代碼如下:
- abstract class Task extends Thread {
- private $info;
- public function __construct($task) {
- $this->info = array();
- $this->info ['task'] = $task;
- $this->info ['finished'] = false;
- $this->info ['terminate'] = false;
- $this->info ['terminated'] = false;
- $this->info ['error'] = false;
- $this->info ['info'] = array ();
- }
- }
后來研究又發(fā)現(xiàn),復(fù)合類型的數(shù)據(jù)整體賦值貌似能起作用,如果程序有很多回調(diào)函數(shù)在線程內(nèi)部用的話就是找死啊.
新聞熱點(diǎn)
疑難解答