Я работаю над установкой 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 секунд.
Увеличение этого лимита позволило корректно завершить сценарий.
Еще кое-что, что нужно проверить:
max_execution_time
или request_terminate_timeout
в вашей конфигурации PHP-FPM? LimitRequestBody
(или любые другие ограничения в этом отношении) в вашей конфигурации Apache? upload_max_filesize
и post_max_size
в вашей конфигурации PHP? В дополнение к отличным предложениям Брэда, пробовали ли вы ignore_user_abort (true) и / или пытались захватить некоторые диагностические данные с помощью register_shutdown_function ()?