Мультикурл зависает на строке
if (curl_multi_select($cmh) != -1)
Не на всех запросах. А на определенных сайтах(включая запрос на свой же домен). Все сайты разные. Кол-во не большое 3-7шт.
Даже таймаут у курл не срабатывает. Скрипт висит пока его не убить.
Уже сдаюсь... Help me...
if(count($urls>0)){
$cmh = curl_multi_init();
// массив заданий для мультикурла
$tasks = array();
// перебираем наши урлы
foreach ($urls as $url) {
// инициализируем отдельное соединение (поток)
$ch = curl_init($url['url']);
// если будет редирект - перейти по нему
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
// возвращать результат
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
//post данные
curl_setopt_array($ch, $url['post']);
// не возвращать http-заголовок
curl_setopt($ch, CURLOPT_HEADER, 0);
// таймаут соединения
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 15);
// таймаут ожидания
curl_setopt($ch, CURLOPT_TIMEOUT, 30);
// добавляем дескриптор потока в массив заданий
$tasks[$url['url']] = $ch;
// добавляем дескриптор потока в мультикурл
curl_multi_add_handle($cmh, $ch);
}
// количество активных потоков
$active = null;
// запускаем выполнение потоков
do {
$mrc = curl_multi_exec($cmh, $active);
}
while ($mrc == CURLM_CALL_MULTI_PERFORM);
// выполняем, пока есть активные потоки
while ($active && ($mrc == CURLM_OK)) {
// если какой-либо поток готов к действиям
if (curl_multi_select($cmh) != -1) {
// ждем, пока что-нибудь изменится
do {
$mrc = curl_multi_exec($cmh, $active);
// получаем информацию о потоке
$info = curl_multi_info_read($cmh);
// если поток завершился
if ($info['msg'] == CURLMSG_DONE) {
$ch = $info['handle'];
// ищем урл страницы по дескриптору потока в массиве заданий
$url = array_search($ch, $tasks);
// забираем содержимое
$tasks[$url] = curl_multi_getcontent($ch);
//myd2( $url.' Ответил за: '.(microtime(true) - $start_t).' сек.');
// удаляем поток из мультикурла
curl_multi_remove_handle($cmh, $ch);
// закрываем отдельное соединение (поток)
curl_close($ch);
}
}
while ($mrc == CURLM_CALL_MULTI_PERFORM);
}
}
// закрываем мультикурл
curl_multi_close($cmh);
}