Я знаю, что PHP CLI обычно используется из-за отсутствия временных ограничений и первичных, поскольку он не использует потоки / процессы Apache.
Но есть ли способ, как явно установить max_execution_time для некоторых скриптов, которые я не хочу иметь свободу «неограниченного времени» и просто хочу, чтобы этот сценарий контролировался?
Если вы считаете, что этот вопрос может быть лучше ответил на superuser.com и иметь разрешение на его перемещение, сделайте это. 🙂
Изменить : я немного искал Google и нашел правильный параметр:
php -d max_execution_time=5 script.php
В документации говорится, что при запуске в режиме командной строки значение по умолчанию равно 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
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, использование реального вычисления, как и бесконечный цикл, работает.
Я нашел этот интересный комментарий на странице сна () 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 }
в$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. Это маловероятно, но вы должны учитывать это как возможность, если используете этот подход.