@vldud

Как избежать 100% CPU при использовании curl_multi_exec?

Добрый день. Для обхода массива url используется следующий код:
$mh = curl_multi_init();

foreach ($urls as $url){
    $ch = curl_init();
    curl_setopt(
        $ch, 
        CURLOPT_URL, 
        $url
    );
	// запоминаем в массив, чтобы потом удалить cURL дескрипторы
    $arCh[$chIter] = $ch;
    curl_multi_add_handle($mh, $arCh[$chIter]);
    $chIter++;
}

// ассинхронные процессы, вешают CPU 100% 
$active = null;
do {
    $mrc = curl_multi_exec($mh, $active);
} while ($mrc == CURLM_CALL_MULTI_PERFORM);
while ($active && $mrc == CURLM_OK) {
    if (curl_multi_select($mh) == -1) {
        usleep(1);
    }
    do {
        $mrc = curl_multi_exec($mh, $active);
    } while ($mrc == CURLM_CALL_MULTI_PERFORM);
}

// убираем за собой
foreach ($arCh as $ch) {
    curl_multi_remove_handle($mh, $ch);
}
curl_multi_close($mh);

Собственно данный код приводит к 100% CPU. Участок помеченный комментарием "// ассинхронные процессы, вешают CPU 100% " менялся на, например, такой:
$running = null;
do {
    curl_multi_select($mh, 5);  
    curl_multi_exec($mh, $running);
} 
while ($running);

но это не помогало.
PHP 5.6.31
curl 7.59.0
  • Вопрос задан
  • 641 просмотр
Пригласить эксперта
Ответы на вопрос 2
xmoonlight
@xmoonlight
https://sitecoder.blogspot.com
За количеством потоков - следить надо!
А не тупо добавлять...
Тут вот читайте
Ответ написан
Sanasol
@Sanasol Куратор тега PHP
нельзя просто так взять и загуглить ошибку
Бесконечные циклы всегда всё вешают... (а тут их целых 3)

Надо нормальные задержки делать или ограничение потоков и задержки.

Самый лучше вариант не страдать: https://github.com/guzzle/guzzle
Там есть и мульти, и пульти, и асинхронные запросы.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы