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程序设计有所帮助。