Установите максимальное время выполнения в интерфейсе командной строки PHP


Я знаю, что PHP CLI обычно используется из-за отсутствия ограничений по времени и основной, потому что он не использует потоки/процессы Apache.

Но есть ли способ явным образом установить max_execution_time для некоторых сценариев, для которых я не хочу иметь свободу "неограниченного времени" и просто хочу держать эти сценарии под контролем?

Если вы считаете, что на этот вопрос можно лучше ответить на superuser.com и у вас есть разрешение переместить его, сделайте это.:)

Редактировать: Я немного погуглил и нашел нужный параметр:

php -d max_execution_time=5 script.php
Author: Radek Simko, 2011-05-03

4 answers

В документации говорится, что при запуске в режиме командной строки значение по умолчанию равно 0 (неограниченно). Это не говорит о том, что вы не можете переопределить его:

set_time_limit(10); // this way
ini_set('max_execution_time', 10); // or this way

Редактировать: Я только что попробовал это сам, и это работает, как и ожидалось.

F:\dev\www>c:php -f index.php
PHP Fatal error:  Maximum execution time of 2 seconds exceeded in F:\dev\www\index.php on line 3

Fatal error: Maximum execution time of 2 seconds exceeded in F:\dev\www\index.php on line 3
 32
Author: Jon, 2015-04-23 08:12:13

Set_time_limit() работает в сценариях командной строки.

<?php 
set_time_limit(1); //in seconds
for (;;);
?>

Через одну секунду возвращается со следующим сообщением об ошибке:

PHP Fatal error:  Maximum execution time of 1 second exceeded in \
/home/stivlo/test.php on line 4

Изначально я пытался использовать sleep(), и ограничение по времени не применяется. Как предположил @Jon, использование реальных вычислений, таких как бесконечный цикл, работает.

Я нашел этот интересный комментарий на странице sleep() PHP:

Примечание: Функция set_time_limit() и директива конфигурации max_execution_time влияют только на выполнение время самого сценария. Любое время, потраченное на действия, которые происходят вне выполнения сценария, такие как системные вызовы с использованием system(), функция сна(), запросы к базе данных и т.д., Не включается при определении максимального времени, в течение которого сценарий был запущен

 19
Author: stivlo, 2011-05-03 20:11:19

Используйте функцию set_time_limit.

 0
Author: Timofey Stolbov, 2011-05-03 20:03:10

У меня аналогичная проблема. Но в моем случае удаленные вызовы базы данных занимали значительное время, и я хотел завершить сценарий через определенное время. Как отмечалось в других ответах, внешние вызовы (или sleep()) не учитываются при заданном значении времени ожидания.

Итак, мой подход состоял в том, чтобы определить pid сценариев, а затем выполнить команду kill -9 после сна. Вот простой пример:

$cmd = "(sleep 10  && kill -9 ".getmypid().") > /dev/null &";
exec($cmd); //issue a command to force kill this process in 10 seconds

$i=0;
while(1){
    echo $i++."\n";
    sleep(1); //simulating a query
}

Обратите внимание, что вполне возможно, что ваш сценарий заканчивается хорошо, и новый, другой, запускается с тем же pid, который завершила бы эта команда уничтожения. Это маловероятно, но вам следует рассмотреть такую возможность, если вы используете этот подход.

 0
Author: Landon, 2017-06-15 18:10:10