У меня есть система CentOS версии 6.3 с Apache httpd 2.2.15 и PHP 5.3.3.
Мой веб-сайт PHP работает нормально, за исключением одного запроса, для которого явно исчерпан лимит времени ожидания. На выполнение запроса теперь требуется более 60 секунд, и в результате браузеры пользователей просто ждут - гораздо дольше, около 5 минут или более - перед тем, как показать пустую страницу.
Это заставило меня задуматься, как работает Apache / PHP.
Я создал простой тестовый сценарий PHP-скрипта, который просто выполняет следующие действия:
Когда таймаут составляет 55 секунд, все работает, как ожидалось; мой браузер вращается в ожидании 55 секунд, а затем отображает HTML.
Когда я устанавливаю тайм-аут на 65 секунд, браузер вращается в течение 5 минут или более, прежде чем отобразить полностью пустую страницу. Между тем:
строка отладки «Я все еще здесь» все еще добавляется к файлу на сервере, показывая, что PHP успешно работает;
журнал доступа Apache также показывает, что запрос был выполнен, возвращая код состояния HTTP 200 и правильное количество байтов, составляющих HTML;
ни Apache, ни PHP не регистрируют ошибок.
Я попытался изменить пару параметров конфигурации, которые мне показались актуальными:
директива Apache httpd.conf 'Timeout', от 60 до 120;
параметр default_socket_timeout для php.ini от 60 до 120.
Но тестовый пример по-прежнему работал точно так же; браузер "зависает" даже после того, как страница возвращается через 65 секунд. Так обстоит дело с несколькими версиями Firefox.
Может ли кто-нибудь помочь мне понять, как здесь все работает? И, во-вторых, как я могу увеличить эффективный лимит тайм-аута, чтобы мой медленный запрос мог выполняться более 60 секунд и успешно возвращать результаты в браузер?
Я ожидал, что, если бы в Apache было ограничение - «не ждите более 60 секунд, пока PHP выполнит запрос» - тогда он либо вернет браузеру какую-то ошибку по прошествии 60 секунд, либо иначе зарегистрируйте другую ошибку. Вместо этого я вижу, как PHP выполняется до завершения, журнал доступа Apache сообщает мне: «Эй, все прошло нормально, я отправил 75 байтов вывода в браузер», но сам браузер просто сидит там, никогда не получая этого вывода. Что молчаливо «отключается»? Если Apache никогда не отправляет ошибку и позволяет PHP работать до завершения, почему он не отправляет результаты обратно (как это указано в журнале доступа)?
Большое спасибо за любую помощь.
Обновите все 60-секундные значения в /etc/php.ini до 120 для тестирования. Если вы перезапустили Apache после изменения конфигурации, но проблема не исчезла, как описано, то, судя по описанию, это вызывает php.