Я выполняю асинхронные запросы скручивания для многомерного массива URL.
Я хочу сделать блокировку, чтобы последующий код не выполнялся до завершения загрузки всех результатов, но иногда это приводит к блокировке сервера, и я не могу даже подключиться по 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);
Когда машина не блокируется, она работает нормально и получает все данные правильно, поэтому код в основном работает, но я думаю, что-то вроде утечки памяти.
Я не уверен, в чем проблема, но строка с *********
нестандартна и была единственным способом заставить ее работать.