測試環境
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.111cn.net 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 (); } } |
後來研究又發現,複合類型的資料整體賦值貌似能起作用。
如果程式有很多回呼函數線上程內部用的話就是找死啊。