curl 多进程任务
curl 添加多进程任务
参考网址:http://php.net/manual/zh/book.curl.php
http://blog.csdn.net/xueling022/article/details/51907990
public function test() { $urls=array( "www.baidu.com", "www.flowerplus.cn", "www.taobao.com" ); $res=self::getMultipleDocuments($urls,null); print_rr($res); } private static function getMultipleDocuments($nodes, $referer){ if(!$referer){ $referer = $nodes[0]; } $node_count = count($nodes); $curl_arr = array(); $master = curl_multi_init(); for($i = 0; $i < $node_count; $i++) { $curl_arr[$i] = curl_init($nodes[$i]); curl_setopt($curl_arr[$i], CURLOPT_FOLLOWLOCATION, true); curl_setopt($curl_arr[$i],CURLOPT_FRESH_CONNECT,true); curl_setopt($curl_arr[$i],CURLOPT_CONNECTTIMEOUT,1);//让链接立即返回 curl_setopt($curl_arr[$i],CURLOPT_TIMEOUT,1);//让链接立即返回 curl_setopt($curl_arr[$i],CURLOPT_RETURNTRANSFER,true); curl_setopt($curl_arr[$i],CURLOPT_REFERER,$referer); curl_multi_add_handle($master, $curl_arr[$i]); } $result = array(); // 轮询 do { while (($execrun = curl_multi_exec($master, $running)) == CURLM_CALL_MULTI_PERFORM) ; if ($execrun != CURLM_OK) { break; } // 一旦有一个请求完成,找出来,处理,因为curl底层是select,所以最大受限于1024 while ($done = curl_multi_info_read($master)) { // 从请求中获取信息、内容、错误 $info = curl_getinfo($done['handle']); $output = curl_multi_getcontent($done['handle']); $error = curl_error($done['handle']); // 将请求结果保存,我这里是打印出来 $result[]=array( 'errno'=>$done['result'], 'msg'=>empty($error)?"success":$error ); // 把请求已经完成了得 curl handle 删除 curl_multi_remove_handle($master, $done['handle']); } // 当没有数据的时候进行堵塞,把 CPU 使用权交出来,避免上面 do 死循环空跑数据导致 CPU 100% if ($running) { $rel = curl_multi_select($master, 1); if($rel == -1){ usleep(1000); } } if( $running == false){ break; } } while (true); curl_multi_close($master); return $result; }

浙公网安备 33010602011771号