Ситуация такова, что иногда этот сервер отключается от сети из-за ddos и ему приходится сбрасывать свой собственный стек TCP. В то время как это происходит, когда этот скрипт выполняется, он обычно зависает на функции cur_exec() примерно на 6 минут или около того, прежде чем окончательно выйдет из строя.
Другие предполагали, и я согласен, что, скорее всего, происходит то, что внутренние части Curl зависают при попытке выполнить HTTP-запрос, и эти зависания либо не учитываются при тайм-ауте, либо это просто своего рода ошибка, при которой вся функция зависает при попытке сделать эти HTTP-запросы. запросы.
Вот мой код:
Код: Выделить всё
set_time_limit(120);
$ch = curl_init($url);
curl_setopt($ch,CURLOPT_USERAGENT,"Mozilla/5.0 etc");
curl_setopt($ch,CURLOPT_RETURNTRANSFER,true);
curl_setopt($ch,CURLOPT_CONNECTTIMEOUT,10);
curl_setopt($ch,CURLOPT_TIMEOUT,10);
curl_setopt($ch,CURLOPT_INTERFACE,OPERATING_IP);
$return = curl_exec($ch);
Есть ли какой-нибудь другой способ БЫСТРО завершить этот вызов. Он загружает только очень маленький статический файл, 10 секунд - это БОЛЕЕ достаточно времени для его загрузки.
Единственный способ, который я могу придумать, - это поместить функцию-оболочку cur_exec() в отдельный скрипт и заставить мой скрипт вызывать ее с аргументом командной строки, который передаст ей фактический URL-адрес. А затем используйте вызов тайм-аута CLI, чтобы заставить его выйти из строя через 10 секунд. Но это беспорядочное решение, должно быть ЧТО-ТО более элегантное?
ОБНОВЛЕНИЕ: Я не хочу добавлять это в качестве официального «ответа», потому что это все еще исправление бандажа. Но, как я уже упоминал в одном из своих комментариев, я преобразовал свой запрос на завивание во внешнюю команду завивки и запустил его с помощью команды timeout, чтобы заставить его завершиться неудачей через 10 секунд.
Код: Выделить всё
$clicurl = "curl -A 'Mozilla/5.0 (etc)' -m 10 --interface ".OPERATING_IP." $url";
$check_result = exec("/usr/local/bin/timeout 10s $clicurl");
Итак, это мой пластырь. Если кто-нибудь знает, как я могу сохранить это в php и заставить его работать, это все равно будет предпочтительнее.