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类库的详细内容...
声明:本文来自网络,不代表【好得很程序员自学网】立场,转载请注明出处:http://haodehen.cn/did29559