it-roy-ru.com

Установить max_execution_time в PHP CLI

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

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

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

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

php -d max_execution_time=5 script.php
38
Radek Simko

В документации говорится, что при работе в режиме командной строки значение по умолчанию равно 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
34
Jon

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

20
stivlo

У меня похожая проблема. Но в моем случае вызовы удаленной базы данных занимали значительное время, и я хотел завершить выполнение сценария через определенное время. Как отмечено в других ответах, внешние вызовы (или 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. Это маловероятно, но вы должны рассмотреть это как возможность, если вы используете этот подход.

1
Landon

Используйте set_time_limit function.

0
Timofey Stolbov