由于php本身不支持多線程,如果我們想在php實現多線程是不是不可行呢?本教程來講講通過php的Socket方式實現php程序的多線程.
通過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 Vevb.com
- @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');
- }
- ?>
新聞熱點
疑難解答