Установить максимальное время выполнения в PHP в CLI
Я знаю, что php CLI обычно используется из-за ограничений по времени и первичных, потому что он не использует потоки/процессы Apache.
но есть ли способ явно установить max_execution_time для некоторых скриптов, которые я не хочу иметь свободу "неограниченного времени" и просто хочу держать этот скрипт под контролем?
Если вы думаете, что на этот вопрос можно лучше ответить на superuser.com и получить разрешение на перемещение, сделать это. :)
редактировать: Я немного погуглил и нашел правильный параметр:
php -d max_execution_time=5 script.php
4 ответов
на документация говорит, что при запуске в режиме командной строки, по умолчанию стоит 0 (без ограничений). Он не говорит, что вы не можете переопределить это:
set_time_limit(10); // this way
ini_set('max_execution_time', 10); // or this way
Edit: Я просто попробовал сам, и он работает, как ожидалось.
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() работает в 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 () страница PHP:
Примечание: функция set_time_limit () и директива конфигурации max_execution_time влияют только на время выполнения самого скрипта. любое время, затраченное на действия, которые происходят вне выполнения скрипта, такие как системные вызовы с использованием system(), функция sleep (), запросы к базе данных и т. д. не входит при определении максимального времени выполнения скрипта
у меня аналогичная проблема. Но в моем случае у меня были удаленные вызовы базы данных, занимающие значительное время, и я хотел завершить сценарий через определенное время. Как отмечено в других ответах, внешние вызовы (или 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, который эта команда kill завершит. Это маловероятно, но вы должны рассматривать это как возможность, если вы используете этот подход.