Установите максимальное время выполнения в интерфейсе командной строки PHP
Я знаю, что PHP CLI обычно используется из-за отсутствия ограничений по времени и основной, потому что он не использует потоки/процессы Apache.
Но есть ли способ явным образом установить max_execution_time для некоторых сценариев, для которых я не хочу иметь свободу "неограниченного времени" и просто хочу держать эти сценарии под контролем?
Если вы считаете, что на этот вопрос можно лучше ответить на superuser.com и у вас есть разрешение переместить его, сделайте это.:)
Редактировать: Я немного погуглил и нашел нужный параметр:
php -d max_execution_time=5 script.php
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
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(), функция сна(), запросы к базе данных и т.д., Не включается при определении максимального времени, в течение которого сценарий был запущен
Используйте функцию set_time_limit.
У меня аналогичная проблема. Но в моем случае удаленные вызовы базы данных занимали значительное время, и я хотел завершить сценарий через определенное время. Как отмечалось в других ответах, внешние вызовы (или 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, который завершила бы эта команда уничтожения. Это маловероятно, но вам следует рассмотреть такую возможность, если вы используете этот подход.