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