Подтвердить что ты не робот

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

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

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

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

Изменить. Я немного искал Google и нашел правильный параметр:

php -d max_execution_time=5 script.php
4b9b3361

Ответ 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 работает

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