Установите max_execution_time в PHP CLI - PullRequest
39 голосов
/ 03 мая 2011

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

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

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

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

php -d max_execution_time=5 script.php

Ответы [ 4 ]

34 голосов
/ 03 мая 2011

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

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

1 голос
/ 13 июня 2017

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

0 голосов
/ 04 мая 2011

Использование функции set_time_limit .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...