Перейти к основному содержанию
 

IIS 7.0 - The FastCGI process exceeded configured request timeout

FastCGI Settings

Привет, сегодня будем лечить ошибку:

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 секунд.

FastCGI

Окружение

Для того, чтобы у вас браузер показал эту ошибку нужны некоторые условия:

  • Веб-сервер 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.

fastcgi

Находим раздел 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.

FastCGI Settings

Заходим внутрь и видим наше PHP FastCGI приложение.

PHP FastCGI application

Выделяем его мышкой и нажимаем справа Edit.

edit

И наконец-то видим искомые настройки:

Edit FastCGI

Меняем на:

ActivityTimeout=600
IdleTimeout=600
RequestTimeout=600

Теперь перезапускаем iis в третий раз и пробуем снова выполнить проблемный php-скрипт - отлично, скрипт работает уже дольше 90 секунд! Даже более того, он проработает 600 секунд, согласно нашим настройкам. И если вам это поможет решить свою проблему - ура!

Мне не помогло. У меня сдохла таблица поисковых индексов на третьей минуте работы скрипта. Но я хотя бы об этом узнал из нормальной информативной ошибки. После чего индексы были удалены и вот теперь скрипт удаления спамера отработал нормально и до конца без ошибок! Правда заняло это гораздо менее 90 секунд, так что таймауты можно было бы не увеличивать, если заранее знать корень зла.

P.S. MySQL таблицу можно попробовать восстановить командой:

CHECK TABLE имя_таблицы;
REPAIR TABLE имя_таблицы;

Теги