本機配置:
apache:2.2-x86
php:5.4 ts-x86
系統:windows 64
pthreads 配置
下載地址:http://windows.php.net/downloads/pecl/releases/pthreads/2.0.9/
pthreads 5.4 下兩個檔案:
php_pthreas.dll 和 pthreadVC2.dll
php_pthreas.dll 放入php ext檔案中
pthreadVC2.dll 放入php 根目錄
php.ini
extension=php_pthreads.dll
apache http.conf 配置
LoadFile "D:/wamp/php/pthreadVC2.dll"
然後重啟apache 無法啟動 cmd 進入apache/bin 命令 httpd -k start 報 cannot load pthreadVC2.dll
疑問:
是否是php版本要64位 apache 才能調用 pthreadVC2.dll?
測試代碼:
arg = $arg; } public function run(){ if($this->arg){ printf("Hello %s\n", $this->arg); } }}$thread = new AsyncOperation("World");if($thread->start()) $thread->join();?>
通過apache 不載入 pthreadVC2.dll ,直接能列印出 helloword
nginx:
運行測試代碼 毫無結果
提問:
php pthreads 多線程擴充 nginx 如何配置?
回複內容:
本機配置:
apache:2.2-x86
php:5.4 ts-x86
系統:windows 64
pthreads 配置
下載地址:http://windows.php.net/downloads/pecl/releases/pthreads/2.0.9/
pthreads 5.4 下兩個檔案:
php_pthreas.dll 和 pthreadVC2.dll
php_pthreas.dll 放入php ext檔案中
pthreadVC2.dll 放入php 根目錄
php.ini
extension=php_pthreads.dll
apache http.conf 配置
LoadFile "D:/wamp/php/pthreadVC2.dll"
然後重啟apache 無法啟動 cmd 進入apache/bin 命令 httpd -k start 報 cannot load pthreadVC2.dll
疑問:
是否是php版本要64位 apache 才能調用 pthreadVC2.dll?
測試代碼:
arg = $arg; } public function run(){ if($this->arg){ printf("Hello %s\n", $this->arg); } }}$thread = new AsyncOperation("World");if($thread->start()) $thread->join();?>
通過apache 不載入 pthreadVC2.dll ,直接能列印出 helloword
nginx:
運行測試代碼 毫無結果
提問:
php pthreads 多線程擴充 nginx 如何配置?
個人覺得pthreads這個擴充不適合應用在Apache/PHP-FPM這些Web服務上,因為這些服務本身就有自己的進程管理模型.在CLI下使用pthreads可能更好些.還有,需要注意的是,不要線上程裡使用echo輸出內容,否則會出現不可預知的錯誤和行為,比如亂碼(garbled).尤其是在非CLI環境下,比如Apache/PHP-FPM.另外,我在Ubuntu上用Nginx+PHP-FPM跑下面的多線程程式,是能正常啟動並執行:
'.str_repeat(' ', 1024*4); ob_flush(); flush();}class Request extends Thread { public $url; public $data; public function __construct($url) { $this->url = $url; } public function run() { // 線程處理一個耗時5秒的任務 for($i=0;$i<5;$i++) { //不要線上程裡使用echo輸出內容 //echo '線程: '.date('H:i:s')."\n"; //do_flush(); //sleep(1); } $response = file_get_contents($this->url); $response = $this->url; if ($response) { $this->data = array($response); } //echo "線程: 任務完成
"; }}$request = new Request('hello.html');// 運行線程:start()方法會觸發run()運行if ($request->start()) { // 主進程處理一個耗時10秒的任務,此時線程已經工作 for($i=0;$i<10;$i++) { echo '進程: '.date('H:i:s')."\n"; do_flush(); sleep(1); }}// 同步線程並輸出線程返回的資料$request->join();echo '線程返回資料: '.$request->data[0];ob_end_flush();
載入pthreads外掛程式必須要求php是 ZTS Enabled ( Thread Safety ) 版,請自行檢查相關版本
我將環境整體換了一下 apache2.4 php 5.6 ts-x64 threads 擴充 正常添加了