好得很程序员自学网

<tfoot draggable='sEl'></tfoot>

PHP多线程的实例,PHP多线程类 - php类库

PHP多线程的实例,PHP多线程类

通过WEB服务器来实现PHP多线程功能,当然,对多线程有深入理解的人都知道通过WEB服务器实现的多线程只能模仿多线程的一些效果,并不是真正意义上的多线程.

但不管怎么样,它还是能满足我们的一些需要的,在需要类似多线程的功能方面还是可以采用这个类,代码如下:

/**   * @title: PHP多线程类(Thread)   * @version: 1.0   * @author: phper.org.cn < web@phper.org.cn >   * @published: 2010-11-2   *   * PHP多线程应用示例:   * require_once 'thread.class.php';   * $thread = new thread();   * $thread->addthread('action_log','a');   * $thread->addthread('action_log','b');   * $thread->addthread('action_log','c');   * $thread->runthread();   *   * function action_log($info) {   * $log = 'log/' . microtime() . '.log';   * $txt = $info . "rnrn" . 'Set in ' . Date('h:i:s', time()) . (double)microtime() . "rn";   * $fp = fopen($log, 'w');   * fwrite($fp, $txt);   * fclose($fp);   * }   */   class  thread {  var   $hooks  =  array ();  var   $args  =  array ();  function  thread() {  }  function  addthread( $func )  {  $args  =  array_slice (func_get_args(), 1);  $this ->hooks[] =  $func ;  $this ->args[] =  $args ;  return  true;  }  function  runthread()  {  if (isset( $_GET [ 'flag' ]))  {  $flag  =  intval ( $_GET [ 'flag' ]);  }  if ( $flag  ||  $flag  === 0)  {  call_user_func_array( $this ->hooks[ $flag ],  $this ->args[ $flag ]);  }  else   {  for ( $i  = 0,  $size  =  count ( $this ->hooks);  $i  <  $size ;  $i ++)  {  $fp = fsockopen ( $_SERVER [ 'HTTP_HOST' ], $_SERVER [ 'SERVER_PORT' ]);  if ( $fp )  {  $out  =  "GET {$_SERVER['PHP_SELF']}?flag=$i HTTP/1.1rn" ;  $out  .=  "Host: {$_SERVER['HTTP_HOST']}rn" ;  $out  .=  "Connection: Closernrn" ;  fputs ( $fp , $out );  fclose( $fp );  }  }  }  }  } 

使用方法,代码如下:

$thread  =  new  thread();  $thread ->addthread( 'func1' , 'info1' );  $thread ->addthread( 'func2' , 'info2' );  $thread ->addthread( 'func3' , 'info3' );  $thread ->runthread(); 

说明:

addthread() 是添加线程函数,第一个参数是函数名,之后的参数(可选)为传递给指定函数的参数.

runthread() 是执行线程的函数.

PHP实例: 利用curl实现多线程下载图片

其实是php利用curl实现的一个多线程类,有了这个类,我们也可利用该类执行多线程任务了,代码如下:

class  curl_multi{        private   $url_list = array ();        private   $curl_setopt = array (            'CURLOPT_RETURNTRANSFER'  => 1, //结果返回给变量             'CURLOPT_HEADER'  => 0, //是否需要返回HTTP头             'CURLOPT_NOBODY'  => 0, //是否需要返回的内容             'CURLOPT_FOLLOWLOCATION'  => 0, //自动跟踪             'CURLOPT_TIMEOUT'  => 6 //超时时间(s)        );        function  __construct( $seconds =30){           set_time_limit( $seconds );       }        /*         * 设置网址         * @list 数组         */         public   function  setUrlList( $list = array ()){            $this ->url_list= $list ;       }        /*         * 设置参数         * @cutPot array         */         public   function  setOpt( $cutPot ){            $this ->curl_setopt= $cutPot + $this ->curl_setopt;       }        /*         * 执行         * @return array         */         public   function  execute(){            $mh =curl_multi_init();            foreach ( $this ->url_list  as   $i => $url ){                $conn [ $i ]=curl_init( $url );                foreach ( $this ->curl_setopt  as   $key  =>  $val ){                   curl_setopt( $conn [ $i ],preg_replace( '/(CURLOPT_w{1,})/ie' , '$0' , $key ), $val );               }               curl_multi_add_handle( $mh , $conn [ $i ]);           }            $active =false;            do {                $mrc =curl_multi_exec( $mh , $active );           } while ( $mrc  == CURLM_CALL_MULTI_PERFORM);               while ( $active   and   $mrc  == CURLM_OK){                if (curl_multi_select( $mh ) != -1){                    do {                        $mrc =curl_multi_exec( $mh , $active );                   } while ( $mrc  == CURLM_CALL_MULTI_PERFORM);               }           }            $res = array ();            foreach ( $this ->url_list  as   $i  =>  $url ){                $res [ $i ]=curl_multi_getcontent( $conn [ $i ]);               curl_close( $conn [ $i ]);               curl_multi_remove_handle( $mh , $conn [ $i ]); //释放资源              }           curl_multi_close( $mh );            return   $res ;       }   } 

php使用多线程下载类示例, 下载远程图片,代码如下:

$curl_mul = new  curl_multi();        $curl_mul ->setUrlList( array ( 'http://HdhCmsTestphpfensi测试数据/img/logo.jpg' , 'http://HdhCmsTestphpfensi测试数据/img/logo.jpg' , 'http://HdhCmsTestphpfensi测试数据/img/logo.jpg' ));        $a = $curl_mul ->execute();        $i =1;        foreach ( $a   as   $v ){            $filename = $i . '.gif' ;            $fp2 =@ fopen ( $filename , 'a' );           fwrite( $fp2 , $v );           fclose( $fp2 );            $i ++;       } 

查看更多关于PHP多线程的实例,PHP多线程类 - php类库的详细内容...

  阅读:53次