@hello_world_666

Почему теряется часть данных в curl multi?

Здравствуйте, почему я теряю часть данных?

Без прокси все данные доходят, как только добавлю прокси то около 50% данных теряется. Прокси не паблик. В чем проблема?

function getResponseByUrlsMulti($urls, $proxy = false) {
		
        $mh = curl_multi_init();
        $chArray = [];

        $urls = !is_array($urls) ? [$urls] : $urls;
        foreach ($urls as $key => $url) {
            $ch = curl_init($url);

    		curl_setopt($ch, CURLOPT_HEADER, false);
    		curl_setopt($ch, CURLOPT_NOBODY, false);
    		curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    		curl_setopt($ch, CURLOPT_TIMEOUT, 10);
    		curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 10);
			curl_setopt($ch, CURLOPT_PROXY, $proxy['ip'].':'.$proxy['port']);
    		curl_setopt($ch, CURLOPT_PROXYUSERPWD, $proxy['login'].':'.$proxy['pass']);

            $chArray[$key] = $ch;

            curl_multi_add_handle($mh, $ch);
        }

        $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(100);
            }

            while (curl_multi_exec($mh, $active) == CURLM_CALL_MULTI_PERFORM);
        }

        foreach ($chArray as $ch) {
            curl_multi_remove_handle($mh, $ch);
        }
        curl_multi_close($mh);

        $result = [];
        foreach ($chArray as $key => $ch) {
            $result[$key] = curl_multi_getcontent($ch);
        }

        return $result;
    }
  • Вопрос задан
  • 54 просмотра
Пригласить эксперта
Ответы на вопрос 1
Belarus007
@Belarus007
Хоть прокси и не паблик, может возникать проблемы с таймаутами конектов, пустыми ответами серверов и т.д.
Я обычно заворачиваю всё это в
while (count($urls) > 0) { ... }
и потом в проверке
$iP = curl_getinfo($curl, CURLINFO_PRIMARY_IP);
$code = curl_getinfo($curl, CURLINFO_RESPONSE_CODE);
if ($iP !== null && $code > 0 && filter_var($iP, FILTER_VALIDATE_IP)) { ... unset($urls[$i]); }

снимаю успешный урл из курл запроса из общего массива с урлами, для неудачных запросов идёт повторение и так пока массив урлов не станет пустым.
Ответ написан
Комментировать
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы