Асинхронный завиток иногда приводит к зависанию сервера - PullRequest
0 голосов
/ 28 августа 2018

Я выполняю асинхронные запросы скручивания для многомерного массива 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);

Когда машина не блокируется, она работает нормально и получает все данные правильно, поэтому код в основном работает, но я думаю, что-то вроде утечки памяти.

Я не уверен, в чем проблема, но строка с ********* нестандартна и была единственным способом заставить ее работать.

1 Ответ

0 голосов
/ 28 августа 2018

Используйте

// 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, показанный в руководстве, не является надежным в моем опыте.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...