php中foreach结合curl实现多线程的方法分析
本文实例讲述了php中foreach结合curl实现多线程的方法。分享给大家供大家参考,具体如下:
多线程是php不支持的但我们可以通过foreach来伪多线程了,但这个伪多线程速度不一定比单线程要单到哪里去了,具体来看个例子.
在利用foreach语句循环图片URL,并通过CURL将所有图片进行本地保存的函数时,出现了只能采集到一个的问题,现将foreach和CURL结合进行多URL请求的方法进行下总结.
方法1:循环请求
$sr=array(url_1,url_2,url_3); foreach($sras$k=>$v){ $curlPost=$v.'?f=传入参数'; $ch=curl_init($curlPost); curl_setopt($ch,CURLOPT_RETURNTRANSFER,true);//获取数据返回 curl_setopt($ch,CURLOPT_BINARYTRANSFER,true);//在启用CURLOPT_RETURNTRANSFER时候将获取数据返回 $data=curl_exec($ch); echo$k.'##:'.$data.'<br>'; } curl_close($ch);
上面代码需要特别注意的是,curl_close一定要放在foreach循环结束的外面,如果放在里面的话,就会出现我上面提到的多个IMGURL,只能采集到一个URL的问题.
方法2:多线程循环
<?php multi_threads_request($nodes){ $mh=curl_multi_init(); $curl_array=array(); foreach($nodesas$i=>$url) { $curl_array[$i]=curl_init($url); curl_setopt($curl_array[$i],CURLOPT_RETURNTRANSFER,true); curl_multi_add_handle($mh,$curl_array[$i]); } $running=NULL; do{ usleep(10000); curl_multi_exec($mh,$running); }while($running>0); $res=array(); foreach($nodesas$i=>$url) { $res[$url]=curl_multi_getcontent($curl_array[$i]); } foreach($nodesas$i=>$url){ curl_multi_remove_handle($mh,$curl_array[$i]); } curl_multi_close($mh); return$res; } print_r(multi_threads_request(array( 'https://www.nhooo.com', 'http://tools.jb51.net', ));
这里主要利用curl_multi_init()实现多个url的请求,不过由于php自身并不支持多线程,所以伪多线程速度也不见得会比单线程快.
更多关于PHP相关内容感兴趣的读者可查看本站专题:《phpcurl用法总结》、《PHP数组(Array)操作技巧大全》、《php排序算法总结》、《PHP常用遍历算法与技巧总结》、《PHP数据结构与算法教程》、《php程序设计算法总结》、《PHP数学运算技巧总结》、《php正则表达式用法总结》、《PHP运算与运算符用法总结》、《php字符串(string)用法总结》及《php常见数据库操作技巧汇总》
希望本文所述对大家PHP程序设计有所帮助。