通過php的Socket方式實現php程式的多線程。php本身是不支援多線程的,那麼如何在php中實現多線程呢?可以想一下,WEB伺服器本身都是支援多線程的。每一個訪問者,當訪問WEB頁面的時候,都將調用新的線程,通過這一點我們可以利用WEB伺服器自身的線程來解決PHP不支援多線程的問題。
下面給出通過 fsockopen() 建立socket串連,然後用 用fputs() 發送訊息,來實現的PHP多線程類代碼:
| 代碼如下 |
複製代碼 |
$fp=fsockopen($_SERVER['HTTP_HOST'],80,&$errno,&$errstr,5); if(!$fp){ echo "$errstr ($errno)<br />n"; } fputs($fp,"GET $_SERVER[PHP_SELF]?flag=1rn"); fclose($fp); |
上面這段代碼只是一個線程的操作過程。多進行幾個這樣的操作就是多線程了。目前所謂PHP的多線程程式都是基於這個方式的。
下面給一個完整的線程類代碼。
| 代碼如下 |
複製代碼 |
<?php /** @title:PHP多線程類(Thread) @version:1.0 @author:axgle <axgle@126.com> */ class thread { var $count; function thread($count=1) {
$this->count=$count; }
function _submit() { for($i=1;$i<=$this->count;$i++) $this->_thread(); return true; }
function _thread() { $fp=fsockopen($_SERVER['HTTP_HOST'],80,&$errno,&$errstr,5);
if(!$fp){ echo "$errstr ($errno)<br />n"; } fputs($fp,"GET $_SERVER[PHP_SELF]?flag=1rn"); fclose($fp); }
function exec($func) { isset($_GET['flag'])?call_user_func($func):$this->_submit(); }
}
//應用例子: $th=new thread(10);//10個線程 $th->exec('demo');//執行行自訂的函數
function demo() { fopen('data/'.microtime(),'w'); }
?> |