PHP-скрипт не истекает по тайм-ауту при использовании curl_exec()Php

Кемеровские программисты php общаются здесь
Anonymous
PHP-скрипт не истекает по тайм-ауту при использовании curl_exec()

Сообщение Anonymous »

У меня есть сценарий оболочки PHP, который запускается через запланированные интервалы через launchd. Скрипт имеет 2-минутный тайм-аут PHP, но я понимаю, что время, затраченное на функцию curl_exec(), в это не засчитывается. Но у меня также установлен 10-секундный тайм-аут cur_exec(), но он также не применяется в определенных ситуациях.
Ситуация такова, что иногда этот сервер отключается от сети из-за 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);
Насколько я понимаю, тайм-аут CURLOPT_CONNECTTIMEOUT включен в тайм-аут CURLOPT_TIMEOUT, поэтому его вызов является избыточным. Но ни один из них на самом деле не работает, поскольку во время сброса TCP на сервере этот вызов Curl обычно занимает 5 или более минут.
Есть ли какой-нибудь другой способ БЫСТРО завершить этот вызов. Он загружает только очень маленький статический файл, 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");
Параметр -m 10 — это 10-секундный тайм-аут в Curl, но команда timeout в вызове exec() вызывает 10-секундный тайм-аут, который, похоже, ДЕЙСТВИТЕЛЬНО работает, когда мой стек tcp сбрасывается и что-то не может разрешиться. Обратите внимание, что единственная проблема, с которой я столкнулся, заключается в том, что когда этот сценарий запускается с помощью launchd, ему требуется полный путь к тайм-ауту, в отличие от того, когда я запускал его вручную в терминале. Это делало отладку интересной. . .
Итак, это мой пластырь. Если кто-нибудь знает, как я могу сохранить это в php и заставить его работать, это все равно будет предпочтительнее.

Вернуться в «Php»