Задать вопрос
Fqyeh29
@Fqyeh29
↓ ИМХО ↓

Почему мультикурл зависает на строке curl_multi_select?

Мультикурл зависает на строке
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);



        }
  • Вопрос задан
  • 751 просмотр
Подписаться 1 Оценить Комментировать
Пригласить эксперта
Ответы на вопрос 1
Taraflex
@Taraflex
Ищу работу. Контакты в профиле.
Используйте более удобные обертки
https://github.com/chuyskywalker/rolling-curl
Ответ написан
Комментировать
Ваш ответ на вопрос

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

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