Что мы имеем мультипоточные запросы курла через PROXY - сервер.
Например PROXY - сервер: 123.456.789.012:3128
Страница запроса: mydomain.com:80
Код: Выделить всё
// инициализируем отдельное соединение (поток)
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_PROXY, $proxy);
curl_setopt($ch, CURLOPT_PROXYTYPE, CURLPROXY_SOCKS5);
curl_setopt($ch, CURLOPT_PORT, 80);
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 60);
curl_setopt($ch, CURLOPT_TIMEOUT, 60);
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);
usleep(10000);
// получаем информацию о потоке
$info = curl_multi_info_read($cmh);
// если поток завершился
if ($info['msg'] == CURLMSG_DONE) {
if ($info['result']) {
// ОШИБКА
}
// удаляем поток из мультикурла
curl_multi_remove_handle($cmh, $ch);
// закрываем отдельное соединение (поток)
curl_close($ch);
}
} while ($mrc == CURLM_CALL_MULTI_PERFORM);
}
}
// закрываем мультикурл
curl_multi_close($cmh);
В принципе все работает нормально, но ясное дело, что прокси из паблик-листов полудохлые.
И бывают случае когда подключение к прокси успешно, а запрашиваемая страница не возвращается.
В таком случае возвращается ошибка ($info['result'] равная 7), т.е. "Failed to connect mydomain.com:3128".
Смущает, что в таком случае показывается порт запрашиваемой страницы от PROXY - сервера. Почему? Может неправильно все-таки формирую поток в cURL ? Если проделать все тоже самое но без мультипоточности, то курл в такой ситуации возвращает правильный порт "Failed to connect mydomain.com:80".