Связь Apache и FPM разорвана из-за тайм-аута скрипта

Связь Apache и FPM разорвана из-за тайм-аута скрипта

Я пытаюсь настроить Apache + PHP-FPM, однако у нас есть долго выполняющийся скрипт, который в конечном итоге был выполнен и время ожидания истекло, что разорвало связь между Apache и FPM, в конечном итоге выведя из строя весь сайт...

Можно ли как-то предотвратить падение всего сайта при достижении --idle-timeout?

FastCgiExternalServer /usr/lib/cgi-bin/php5-fcgi -socket /var/run/php5-fpm.sock -idle-timeout 18000 -pass-header Authorization

решение1

Запрос Apache к php-fpmбудет прерван по достижении тайм-аута. Таким образом, и для пользователя. Если вы хотите, чтобы конечный клиент получил ответ, на ум приходят три варианта:

  1. увеличьте значение тайм-аута (так как ваше PHP-приложение работает медленнее)
  2. попробуйте ускорить выполнение вашего PHP-приложения для этого запроса
  3. пусть ваше PHP-приложение подсчитает время, которое оно займет, и выдаст сообщение об ошибке, если оно займет больше времени, чем указано в вашем значении тайм-аута

Решение №2, на мой взгляд, было бы обычным выбором разработчика.

решение2

Долго работающие скрипты не должны запускаться из браузера/Apache. Вы должны запускать их в фоновом режиме с PHP CLI вместо FPM. Скрипты CLI не имеют тайм-аута и не мешают работе Apache.

Вы можете либо запланировать регулярный запуск скрипта с помощью cronjobs, либо сделать так, чтобы он запускался из браузера, выполнив что-то вроде записи временного файла (например, поместите файл с именем run_scriptв каталог вашего веб-сайта и удалите его в конце скрипта) или установки флага в базе данных или другом бэкэнде.

При выборе второго способа вам все равно понадобится cronjob (который может запускаться раз в минуту), который проверяет существование этого файла/записи базы данных и запускает скрипт, когда он найден (вы также можете создать прослушиватель, который будет отслеживать это постоянно, а не раз в минуту, но это довольно ресурсоемко и, вероятно, избыточно для большинства случаев использования).

После запуска все, что вы отправляете своим пользователям, — это просто уведомление типа «Подождите, мы обрабатываем ваш запрос. Пожалуйста, проверьте через несколько минут». Таким образом, им также не нужно держать браузер открытым, чтобы запрос выполнялся, и они могут просто заниматься другими делами в это время.

Связанный контент