帝国CMS模板大全
www.admin99.cn
www.92cms.cn 帝国CMS模板下载站!,情怀,养站,二次开发!源码需求比较大的一站式会员下载,价更省!!!

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://www.phpfensi.com/img/logo.jpg' , 'http://www.phpfensi.com/img/logo.jpg' , 'http://www.phpfensi.com/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 ++;  
    } 

赞(0)
版权声明:本文采用知识共享 署名4.0国际许可协议 [BY-NC-SA] 进行授权
文章名称:《PHP多线程的实例,PHP多线程类 - php类库》
文章链接:https://www.admin99.cn/8311
本站资源仅供个人学习交流,请于下载后24小时内删除,不允许用于商业用途,否则法律问题自行承担。
QQ站长交流群:953950264

登录

找回密码

注册