php exec () – max_execution_time и Fatal error

При изменении размера изображения (около 9000) я использую эту функцию:

function im_call($_data, &$_im_output, $_debug = IM_DEBUG) { ini_set('max_execution_time', '3600'); exec($_data, $_im_output, $_im_error); // this is line 93 return $_im_error; } // end function 

И через некоторое время (около 30 МИНУТ) PHP умирает с:

Неустранимая ошибка: максимальное время выполнения 30 секунд превышено в /some/path/im_lib.php в строке 93

(это строка с exec () …)

Как это возможно?

Системные вызовы не учитывают время выполнения PHP и так мало влияют на max_execution_time и set_time_limit . Если вы вызываете свой скрипт с веб-сервера, вы должны знать, что веб-сервер (а не PHP) может отключить HTTP-соединение.

Например:

Конфигурация по умолчанию Apache:

 # Timeout: The number of seconds before receives and sends time out. # Timeout 180 # KeepAlive: Whether or not to allow persistent connections (more than # one request per connection). Set to "Off" to deactivate. # KeepAlive On # MaxKeepAliveRequests: The maximum number of requests to allow # during a persistent connection. Set to 0 to allow an unlimited amount. # We recommend you leave this number high, for maximum performance. # MaxKeepAliveRequests 100 # KeepAliveTimeout: Number of seconds to wait for the next request from the # same client on the same connection. # KeepAliveTimeout 15 

Каждые 15 секунд отправляйте живое, повторите 100 раз = 1515 секунд между запуском HTTP-запроса и закрытием соединения. Это около 25 минут, почти полчаса. Даже если речь идет о веб-сервере <> Клиент, а не веб-сервер <> PHP, веб-сервер (и клиент!) По-прежнему может просто отказаться от соединений через некоторое время.

Сценарии длиной более нескольких минут должны всегда запускаться с консоли. HTTP-серверы не хотят поддерживать один запрос в течение нескольких часов.

Используйте скрипты PHP из консоли (linux):

 #!/usr/bin/php <?php /* code */ 

В сочетании с set_time_limit , сборщиком мусора PHP и настройками для большей памяти эти сценарии могут работать веками.

Приложение:

Функция set_time_limit () и директива конфигурации max_execution_time влияют только на время выполнения самого скрипта. Любое время, затрачиваемое на активность, которое происходит вне выполнения сценария, например системные вызовы с использованием system (), потоковые операции, запросы к базе данных и т. Д., Не включается при определении максимального времени выполнения сценария. Это не относится к Windows, где измеренное время реально.

http://php.net/manual/en/function.set-time-limit.php

Использовать установленный предел времени

 set_time_limit(0);