我正在对URL的多维数组执行异步curl请求。
我想执行阻止操作,以便在完成所有结果的下载之前不会执行后续代码,但是有时这会导致服务器锁定,甚至无法通过SSH进入计算机,因此必须重新启动计算机
$mh = curl_multi_init();
$aCurlHandles = array(array());
foreach($a_urls as $key => $inner_array){
foreach($inner_array as $inner_key => $jsonresult){
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $a_urls[$key][$inner_key]);
curl_setopt($ch, CURLOPT_RETURNTRANSFER,1);
curl_setopt($ch, CURLOPT_HEADER, 0);
$aCurlHandles[$key][$inner_key] = $ch;
curl_multi_add_handle($mh,$ch);
}
}
$active = null;
do{
$mrc = curl_multi_exec($mh, $active);
}while($mrc === CURLM_CALL_MULTI_PERFORM || $active); // ********* added "|| $active"
while($active && $mrc == CURLM_OK){
if(curl_multi_select($mh) != -1){
do{
$mrc = curl_multi_exec($mh, $active);
}while($mrc == CURLM_CALL_MULTI_PERFORM);
}
}
$a_results = array(array());
foreach($aCurlHandles as $key => $inner_array){
foreach($inner_array as $inner_key => $ch){
$response = curl_multi_getcontent($ch);
$jsonresult = json_decode($response);
$a_results[$key][$inner_key] = $jsonresult;
curl_multi_remove_handle($mh, $ch);
}
}
curl_multi_close($mh);
当它不能锁定机器时,它可以正常工作并且可以正确接收所有数据,因此代码大部分可以正常工作,但是我想可能会发生诸如内存泄漏之类的事情。
我不确定是什么问题,但是带有*********
的行是非标准的,并且是我可以使其正常工作的唯一方法。
答案 0 :(得分:0)
使用
// execute all queries simultaneously, and continue when all are complete
$running = null;
do {
curl_multi_exec($mh, $running);
} while ($running);
根据手册中的评论:http://php.net/manual/en/function.curl-multi-init.php
根据我的经验,手册中显示的CURLM_CALL_MULTI_PERFORM示例并不可靠。