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