PHP多线程之内部多线程实例分析
本文实例分析了PHP多线程之内部多线程用法。分享给大家供大家参考。具体如下:
<?php
classHttp_MultiRequest
{
//要并行抓取的url列表
private$urls=array();
//curl的选项
private$options;
//构造函数
function__construct($options=array())
{
$this->setOptions($options);
}
//设置url列表
functionsetUrls($urls)
{
$this->urls=$urls;
return$this;
}
//设置选项
functionsetOptions($options)
{
$options[CURLOPT_RETURNTRANSFER]=1;
if(isset($options['HTTP_POST']))
{
curl_setopt($ch,CURLOPT_POST,1);
curl_setopt($ch,CURLOPT_POSTFIELDS,$options['HTTP_POST']);
unset($options['HTTP_POST']);
}
if(!isset($options[CURLOPT_USERAGENT]))
{
$options[CURLOPT_USERAGENT]='Mozilla/4.0(compatible;MSIE6.0;WindowsNT5.1;SV1;)';
}
if(!isset($options[CURLOPT_FOLLOWLOCATION]))
{
$options[CURLOPT_FOLLOWLOCATION]=1;
}
if(!isset($options[CURLOPT_HEADER]))
{
$options[CURLOPT_HEADER]=0;
}
$this->options=$options;
}
//并行抓取所有的内容
functionexec()
{
if(empty($this->urls)||!is_array($this->urls))
{
returnfalse;
}
$curl=$data=array();
$mh=curl_multi_init();
foreach($this->urlsas$k=>$v)
{
$curl[$k]=$this->addHandle($mh,$v);
}
$this->execMulitHandle($mh);
foreach($this->urlsas$k=>$v)
{
$data[$k]=curl_multi_getcontent($curl[$k]);
curl_multi_remove_handle($mh,$curl[$k]);
}
curl_multi_close($mh);
return$data;
}
//只抓取一个网页的内容。
functionexecOne($url)
{
if(empty($url)){
returnfalse;
}
$ch=curl_init($url);
$this->setOneOption($ch);
$content=curl_exec($ch);
curl_close($ch);
return$content;
}
//内部函数,设置某个handle的选项
privatefunctionsetOneOption($ch)
{
curl_setopt_array($ch,$this->options);
}
//添加一个新的并行抓取handle
privatefunctionaddHandle($mh,$url)
{
$ch=curl_init($url);
$this->setOneOption($ch);
curl_multi_add_handle($mh,$ch);
return$ch;
}
//并行执行(这样的写法是一个常见的错误,我这里还是采用这样的写法,这个写法
//下载一个小文件都可能导致cup占用100%,并且,这个循环会运行10万次以上
//这是一个典型的不懂原理产生的错误。这个错误在PHP官方的文档上都相当的常见。)
privatefunctionexecMulitHandle($mh)
{
$running=null;
do{
curl_multi_exec($mh,$running);
}while($running>0);
}
}
/*下面是上面的类的一个测试的例子:*/
$urls=array("http://baidu.com","http://baidu.com","http://baidu.com","http://baidu.com","http://baidu.com","http://baidu.com","http://www.google.com","http://www.sina.com.cn",);
$m=newHttp_MultiRequest();
$t=microtime(true);
$m->setUrls($urls);
//parallelfetch(并行抓取):
$data=$m->exec();
$parallel_time=microtime(true)-$t;
echo$parallel_time."\n";
$t=microtime(true);
//serialfetch(串行抓取):
foreach($urlsas$url)
{
$data[]=$m->execOne($url);
}
$serial_time=microtime(true)-$t;
echo$serial_time."\n";
希望本文所述对大家的php程序设计有所帮助。