PHP多线程的实例(PHP多线程类)
文章给大家整理两个PHP多线程了,一个是模仿java的多线程了,另一个是使用了curl实现多线程序采集图片了,下面我们一起来看看。
通过WEB服务器来实现PHP多线程功能。
当然,对多线程有深入理解的人都知道通过WEB服务器实现的多线程只能模仿多线程的一些效果,并不是真正意义上的多线程。
但不管怎么样,它还是能满足我们的一些需要的,在需要类似多线程的功能方面还是可以采用这个类。
<?php
/**
* @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() 是执行线程的函数。
例2.利用curl实现多线程下载图片
其实是php利用curl实现的一个多线程类),有了这个类,我们也可利用该类执行多线程任务了!
<?php
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://s1.phprm.com/img/php_logo.png','http://s1.phprm.com/img/php_logo.png','http://s1.phprm.com/img/php_logo.png'));
$a=$curl_mul->execute();
$i=1;
foreach($a as $v){
$filename=$i.'.gif';
$fp2=@fopen($filename,'a');
fwrite($fp2,$v);
fclose($fp2);
$i++;
}文章链接:http://www.phprm.com/code/56160.html
随便收藏,请保留本文地址!