Назад | Перейти на главную страницу

PHP останавливает веб-скрипт через 60 секунд

Я работаю над установкой Bitnami Apache2 и PHP (5.6), и у нас возникли проблемы со сценарием, выполнение которого занимает более 60 секунд.

Этот сценарий не работает через 60 секунд, отправляя ошибку 504.

Я уже проверил все другие возможности, но он продолжает возвращаться ко времени выполнения.

if(round($mem_usage/1048576,2) > 36)
{
    echo "exceded 36mb, aborting<br>";
    echo "element: ".$fila." of ".mysql_num_rows($result)."<br>";
    echo "memory usage: ".round($mem_usage/1048576,2)."M <br>";
    echo "memory limit: ".ini_get('memory_limit')." <br>";
    echo "max_execution_time: ".ini_get('max_execution_time')."<br>";
    $time_end = microtime(true);
    $time = $time_end - $time_start;
    echo "time elapsed: ".ceil($time)." seconds";

    exit();
}

Значения памяти всегда ниже нормального диапазона (мы увеличили лимит памяти на всякий случай), но скрипту не удавалось распечатать это сообщение по истечении 60 секунд, поэтому мы отказались от использования памяти.

Я много искал в вопросах StackExchange и составил список общих ответов на эту проблему:

Мы пробовали увеличить его до 300, но это не дало результата. Кажется, что PHP игнорирует это значение, уже проверенное php_info () на всякий случай, если оно не было установлено, но это так.

См. Выше, использование оперативной памяти в пределах нормы. Не причина сбоев.

Сценарии останавливаются и не выполняют код внутри блока catch.

PHP НЕ бросает ничего в журналы ошибок, он просто прерывает скрипт внезапно и без каких-либо выходных данных, мы уже проверили параметры журнала в php.ini

Этот метод возвращает FALSE, согласно документации, это означает, что он не может установить новый предел времени, какой безопасный режим является частой причиной этого, что приводит нас к следующему шагу.

Согласно документации, это PHP5.6.

This feature has been DEPRECATED as of PHP 5.3.0 and REMOVED as of PHP 5.4.0.

Ставим 300, эффекта нет.

То же самое

Готово, и мы ничего не нашли.

У нас не было опции тайм-аута в нашей конфигурации Apache, и когда она была добавлена, она не действовала.

Это невозможно для некоторых сценариев PHP, но пробовали ли вы запускать сценарий из командной строки, а не через HTTP-запрос? Это исключит, если конфигурация Apache или PHP-FPM все испортит.

Этот сценарий не может быть запущен в CLI, но запуск фиктивного сценария вызывает выполнение на неопределенный срок, поэтому CLI не останавливает выполнение.

У вас есть что-нибудь, установленное для max_execution_time или request_terminate_timeout в вашей конфигурации PHP-FPM?

request_terminate_timeout установлен на 300, никакого эффекта. php_admin_value [max_execution_time] установлен на 300, без эффекта. (этот параметр должен быть установлен таким образом, согласно документации)

У вас есть что-нибудь, установленное для LimitRequestBody (или каких-либо других ограничений в этом отношении) в вашей конфигурации Apache?

Нигде не установлен, и никаких других связанных ограничений в конфигурации Apache нет.

Вы выполняете загрузку файла, когда это происходит? Если да, то проверяли ли вы upload_max_filesize и post_max_size в своей конфигурации PHP?

В этом запросе не выполняется загрузка файлов, поэтому эти ограничения не имеют значения в данной конкретной ситуации.

Не имеет смысла получать разные ответы в зависимости от браузера, если только вы не выполняете какое-то обнаружение браузера в своем PHP и ваше приложение ведет себя по-разному в зависимости от этого. Если вы этого не делаете и можете постоянно подтверждать эту корреляцию, вы можете сделать одно - посмотреть, отправляют ли по какой-то причине два разных браузера разные запросы.

По-видимому, именно так Firefox отображает ошибку, используя консоль разработчика в сети, показывает 504, как в Chrome (Моя ошибка, когда я задал вопрос, поскольку я поставил 503 случайно).

вы пробовали ignore_user_abort (true)

Только что включил ignore_user_abort (через настройки PHP-FPM). И это не подействовало.

и / или пытаетесь получить диагностику через register_shutdown_function ()?

Попытка зарегистрировать функцию выключения не имеет никакого эффекта, поскольку блок кода никогда не выполняется.


В заключение отметим, что на этом сервере есть PHP-FPM, и именно здесь мы настраиваем конфигурации PHP, однако ничего из того, что мы делаем, не имеет никакого эффекта, и рассматриваемый сценарий все еще завершается через 60 секунд.

Мы будем благодарны за любую помощь в этом вопросе.

Вы обращаетесь к серверу Apache напрямую, через балансировщик нагрузки или прокси?

Этот комментарий в OP заставил меня понять, что мы используем AWS Load Balancer. После проверки документации мы увидели, что тайм-аут простоя по умолчанию составляет 60 секунд.

Увеличение этого лимита позволило корректно завершить сценарий.

Еще кое-что, что нужно проверить:

  • Это невозможно для некоторых сценариев PHP, но пробовали ли вы запускать сценарий из командной строки, а не через HTTP-запрос? Это исключит, если конфигурация Apache или PHP-FPM все испортит.
  • У тебя есть что-нибудь для max_execution_time или request_terminate_timeout в вашей конфигурации PHP-FPM?
  • У тебя есть что-нибудь для LimitRequestBody (или любые другие ограничения в этом отношении) в вашей конфигурации Apache?
  • Вы выполняете загрузку файла, когда это происходит? Если да, проверили ли вы upload_max_filesize и post_max_size в вашей конфигурации PHP?
  • Не имеет смысла получать разные ответы в зависимости от браузера, если только вы не выполняете какое-то обнаружение браузера в своем PHP и ваше приложение ведет себя по-разному в зависимости от этого. Если вы этого не делаете и можете постоянно подтверждать эту корреляцию, вы можете сделать одно - посмотреть, отправляют ли по какой-то причине два разных браузера разные запросы.

В дополнение к отличным предложениям Брэда, пробовали ли вы ignore_user_abort (true) и / или пытались захватить некоторые диагностические данные с помощью register_shutdown_function ()?