Долгий PHP скрипт и 500 Internal Server Error

Рейтинг: 1Ответов: 2Опубликовано: 17.02.2011

Есть PHP скрипт, запускаемый из браузера, время выполнения - несколько часов.

Минут через 20 после запуска в браузере вылетает 500 Internal Server Error, сам скрипт при этом продолжает работать, успешно все доделывает и не выполняется только последняя строчка (запись в лог-файл).

max_execution_time выставлен в 360000. Скрипт при этом жрет 40-50% процессора.

В чем может быть проблема?

Ответы

▲ 4

Попробуйте копнуть в сторону технологии AJAX. На страничке HTML сделать с помощью JS запрос AJAX, на сервере скрипт PHP пускай отдает какой-либо ответ. JS на HTML будет получать сам ответ и отображать его на странице HTML.

Таким образом вы на 100% будете знать, в каком состоянии находится выполнение PHP скрипта. (Ну... хотя бы будете в курсе его выполнения).

Теперь по предыдущим комментам:

А где выставлен max_execution_time? Вы выставили через php.ini или через .htaccess?

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

@kirelagin подобные вопросы для PHP-публики редко актуальны :)

Напрасно вы так думаете :) ...Я как разработчик уже сталкивался с этим и частенько сталкиваюсь и по сей день :)

Может есть смысл каждые 19 минут отправлять браузеры какой-то HTML коммент?

В любом случае, PHP генерирует HTML контент. Если отправить код через 19 минут, не факт, что его увидят на стороне.

Мой итог таков: AJAX вам в помощь :)

P.S. Погуглите на тему ajax.js. Так же можно обойтись с помощью jQuery.

▲ 2

Скорее всего, ваш веб-сервер, на котором запущен скрипт, стоит бэкендом к другому веб-серверу. Хороший пример - nginx+apache. 500-я ошибка возникает из за того, что, когда вы делаете запрос, его начинает обрабатывать nginx, видит динамический контент, который должен обработать apache, перенаправляет запрос к нему и ждет, пока тот завершит работу, или по истечению тайм-аута, в вашем случае, - 20 мин, отдает пользователю 500-ю ошибку. В данном случае указания max_execution_time не помогут, т.к. они направлены к апачу, а не к nginx.

P.S. решить проблему можно:

  1. запускать скрипт как cgi от имени nginx,
  2. убрать тайм-аут при переброске через nginx.

P.P.S. Что касается записи в лог файл, я бы посоветовал перехватить поток ошибок скрипта и записать его в файл, скорее всего, там выявиться какая-нибудь ошибка, например, ошибка доступа к файлу.