При изменении размера изображения (около 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, где измеренное время реально.
Использовать установленный предел времени
set_time_limit(0);