Установить максимальное время выполнения в 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 (), запросы к базе данных и т. д. не входит при определении максимального времени выполнения скрипта


использовать 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, который эта команда kill завершит. Это маловероятно, но вы должны рассматривать это как возможность, если вы используете этот подход.