Как действительно ограничить максимальное время выполнения скрипта PHP?

Всем привет!

Как известно max_execution_time можно ограничить время выполнения сценария, однако если в процессе выполнения будет вызван, например, file_get_contents, который будет запрашивать url, который отвечает например 100 сек, то при max_execution_time 30 сек, всё равно скрипт будет выполняться 100 сек. Об этом, собственно, указано в документации PHP.

Вопрос: реально ли как-либо ограничить время выполнения в данном случае в 30 сек, при этом не задавая контекст file_get_contents или не устанавливая максимальное время для сокетов. То есть интересует безусловное прекращение скрипта, вне зависимости от того что там в коде.

Спасибо!
  • Вопрос задан
  • 790 просмотров
Решения вопроса 1
@neol
Для php-fpm есть request_terminate_timeout


The timeout for serving a single request after which the worker process will be killed. This option should be used when the 'max_execution_time' ini option does not stop script execution for some reason. A value of '0' means 'off'. Available units: s(econds)(default), m(inutes), h(ours), or d(ays)
Default Value: 0


Для apache можно глянуть в сторону TimeOut, но я не уверен, что это сработает именно так, как нужно (давно не использовал apache).
Ответ написан
Пригласить эксперта
Ответы на вопрос 3
SilenceOfWinter
@SilenceOfWinter Куратор тега PHP
та еще зажигалка...
однако если в процессе выполнения будет вызван, например, file_get_contents, который будет запрашивать url, который отвечает например 100 сек, то при max_execution_time 30 сек, всё равно скрипт будет выполняться 100 сек

тесты в студию)

register_tick_function поможет решить эту абстрактную проблему
Ответ написан
Stalker_RED
@Stalker_RED
Можно выставить лимиты и для file_get_contents
ini_set('default_socket_timeout', 30);

$ctx = stream_context_create(array('http'=>
    array(
        'timeout' => 1200,  //1200 Seconds is 20 Minutes
    )
));

echo file_get_contents('http://example.com/', false, $ctx);

© so
Ответ написан
@Crabster
set_time_limit(30);

И скрипту по барабаны что там внутри происходит
Ответ написан
Ваш ответ на вопрос

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

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