手机上可视化编程app/企业seo顾问公司
在项目同步微信素材库时发现请求等待时间很长,排查之后发现是crul的问题,php中curl是阻塞的,从而导致时间过长,针对这个问题对代码进行了优化,代码如下:
// PHP代码
function Post_curl($urls = array(),$callback = '', $post_data = array()){$response = array();if (empty($urls)) {return $response;}$chs = curl_multi_init();$map = array();foreach($urls as $url){$ch = curl_init();curl_setopt($ch, CURLOPT_URL, $url);curl_setopt ($ch, CURLOPT_POST, 1);if($post_data != ''){ curl_setopt($ch, CURLOPT_POSTFIELDS, $post_data); }curl_setopt($ch, CURLOPT_TIMEOUT, 1);curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);curl_setopt($ch, CURLOPT_HEADER, 0);curl_setopt($ch, CURLOPT_NOSIGNAL, true);curl_multi_add_handle($chs, $ch);$map[strval($ch)] = $url;}do{if (($status = curl_multi_exec($chs, $active)) != CURLM_CALL_MULTI_PERFORM) {if ($status != CURLM_OK) { break; } //如果没有准备就绪,就再次调用curl_multi_execwhile ($done = curl_multi_info_read($chs)) {$info = curl_getinfo($done["handle"]);$error = curl_error($done["handle"]);$result = curl_multi_getcontent($done["handle"]);$url = $map[strval($done["handle"])];$rtn = compact('info', 'error', 'result', 'url');if (trim($callback)) {$callback($rtn);}$response[$url] = $rtn;curl_multi_remove_handle($chs, $done['handle']);curl_close($done['handle']);//如果仍然有未处理完毕的句柄,那么就selectif ($active > 0) {curl_multi_select($chs, 1); //此处会导致阻塞大概1秒。}}}}while($active > 0); //还有句柄处理还在进行中curl_multi_close($chs);return $response;
}//使用方法
function deal($data){if ($data["error"] == '') {print_r($data["info"];} else {echo $data["url"]." -- ".$data["error"]."\n";}
}
$urls = array();
for ($i = 0; $i < 100; $i++) {$urls[] = 'http://www.baidu.com/s?wd=etao_'.$i;$urls[] = 'http://www.so.com/s?q=etao_'.$i;$urls[] = 'http://www.soso.com/q?w=etao_'.$i;
}
Post_curl($urls, "deal");
相关PHP函数详解:
curl_multi_init() 允许并行地处理批处理cURL句柄。
curl_multi_add_handle ( resource $mh , resource $ch ) 向curl批处理会话中添加单独的curl句柄。
curl_multi_exec ( resource KaTeX parse error: Expected 'EOF', got '&' at position 10: mh , int &̲still_running ) — 运行当前 cURL 句柄的子连接 still_running一个用来判断操作是否仍在执行的标识的引用。
curl_multi_info_read ( resource $mh )获取当前解析的cURL的相关传输信息。