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 ++;
}