Привет, сегодня будем лечить ошибку:
HTTP Error 500.0 - Internal Server Error
C:\Program Files (x86)\PHP\php-cgi.exe - The FastCGI process exceeded configured request timeout
Пути к php-cgi.exe могут отличаться в каждом конкретном случае. Ошибка происходит при превышении таймаута работы скрипта. По умолчанию таймаут FastCGI 90 секунд.
Окружение
Для того, чтобы у вас браузер показал эту ошибку нужны некоторые условия:
- Веб-сервер IIS 7.0
- Настроенный на веб сервере PHP через FastCGI
- Браузер открытый локально на сервере, иначе покажется просто ошибка 500. Открывать ошибки наружу - плохой тон.
- И попытка выполнить долгий php-скрипт, который отлетит по таймауту.
Зачем увеличивать таймаут
Я не знаю зачем вам увеличивать таймаут. Я бы и себе не стал этого делать, долгое выполнение скрипта - прямая дорога к его оптимизации. Но всегда есть какая-нибудь причина, которая нас заставит это сделать.
В моём случае причиной выступил спамер, накидавший в мой phpbb форум 10000 сообщений. При попытке удалить засранца, я получил 500 в бубен. В таком случае всегда можно почистить базу данных напрямую, но это не наш метод.
Забегая вперёд скажу, что проблема была не в 10000 топиках, а в разросшихся поисковых индексах. Достаточно было удалить индексы и... тогда этой статьи бы не было. Кстати, индексы в phpbb удаляются здесь: Обслуживание - База данных - Поисковые индексы.
Таймуаты-таймауты
Сначала идём в php.ini файл и выполняем настройки:
max_execution_time = 600
max_input_time = 600
memory_limit = 512M
default_socket_timeout = 600
mysql.connect_timeout = 600
Т.е. увеличиваем нужные нам таймауты до 600 секунд. Если вы используете не MySQL, то поправьте таймаут к соединению с вашим типом БД. Добавляем также памяти, т.к. в логе ошибок PHP встретилась неприятность:
[11-Feb-2018 22:43:58 Europe/Moscow] PHP Fatal error: Allowed memory size of 268435456 bytes exhausted (tried to allocate 24 bytes) in ***путь***\phpbb\cache\driver\base.php on line 118
Она не относится к нашей проблеме, но тоже мешает выполнить большой php-скрипт и грохнуть спамера со всеми его опусами.
Теперь перезапускаем IIS и пробуем снова выполнить проблемный php-скрипт - и ничего не получается, потому что не все таймауты мы поправили. Идём дальше.
Запускаем оснастку IIS 7.0, выбираем наш сайт и нажимаем Advanced Settings.
Находим раздел Connection Limits, в нём Connection Time-out (seconds) и тоже меняем на 600 секунд.
Теперь перезапускаем IIS и пробуем снова выполнить проблемный php-скрипт - и снова ничего не получается, потому что не все таймауты мы поправили. Идём дальше.
Ищем в интернете AdminPack для IIS 7.0, скачиваем и устанавливаем на сервер. Перезагрузка не потребуется.
https://www.microsoft.com/en-us/download/details.aspx?id=13092
После установки пака в оснастке IIS появится новая иконка FastCGI Settings.
Заходим внутрь и видим наше PHP FastCGI приложение.
Выделяем его мышкой и нажимаем справа Edit.
И наконец-то видим искомые настройки:
Меняем на:
ActivityTimeout=600
IdleTimeout=600
RequestTimeout=600
Теперь перезапускаем iis в третий раз и пробуем снова выполнить проблемный php-скрипт - отлично, скрипт работает уже дольше 90 секунд! Даже более того, он проработает 600 секунд, согласно нашим настройкам. И если вам это поможет решить свою проблему - ура!
Мне не помогло. У меня сдохла таблица поисковых индексов на третьей минуте работы скрипта. Но я хотя бы об этом узнал из нормальной информативной ошибки. После чего индексы были удалены и вот теперь скрипт удаления спамера отработал нормально и до конца без ошибок! Правда заняло это гораздо менее 90 секунд, так что таймауты можно было бы не увеличивать, если заранее знать корень зла.
P.S. MySQL таблицу можно попробовать восстановить командой:
CHECK TABLE имя_таблицы;
REPAIR TABLE имя_таблицы;