Enlace de Apache y FPM cortado por el tiempo de espera del script

Enlace de Apache y FPM cortado por el tiempo de espera del script

Estoy intentando configurar Apache + PHP-FPM, sin embargo, tenemos un script de ejecución prolongada que se ejecutó y finalmente se agotó el tiempo de espera, lo que cortó el vínculo entre Apache y FPM y finalmente provocó la caída de todo el sitio...

¿Hay alguna forma de evitar que todo el sitio caiga si se alcanza el tiempo de espera de inactividad?

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

Respuesta1

La solicitud de Apache a php-fpmSe cancelará cuando se alcance el tiempo de espera.. Por tanto, también para el usuario. Si desea que el cliente final obtenga una respuesta, se le ocurren tres posibilidades:

  1. aumente su valor de tiempo de espera (ya que su aplicación PHP es más lenta que eso)
  2. Intente hacer que su aplicación PHP sea más rápida para esa solicitud.
  3. Haga que su aplicación PHP calcule el tiempo que está tardando y responda con un mensaje de error si está tardando más que su valor de tiempo de espera.

La solución n.° 2 sería la opción habitual de los desarrolladores en mi humilde opinión.

Respuesta2

Los scripts de larga duración no deben ejecutarse desde el navegador/Apache. Debes ejecutarlo en segundo plano con PHP CLI en lugar de FPM. Los scripts CLI no vencen el tiempo de espera y no interfieren con el funcionamiento de Apache.

Puede programar el script para que se ejecute periódicamente mediante cronjobs o puede hacer que se active desde el navegador haciendo algo como escribir un archivo temporal (por ejemplo, coloque un archivo llamado run_scripten el directorio de su sitio web y elimínelo al final del script). ) de establecer una bandera en una base de datos u otro backend.

Al optar por la segunda forma, aún necesita un cronjob (que puede ejecutarse una vez por minuto) que verifique la existencia de este archivo/entrada de base de datos y ejecute el script cuando lo encuentre (también puede crear un detector que monitoree esto). constantemente en lugar de una vez cada minuto, pero eso es bastante intensivo y probablemente excesivo para la mayoría de los casos de uso).

Una vez que se activa, todo lo que envía a sus usuarios es solo un aviso como "Espera, estamos procesando tu solicitud. Vuelve a consultar en unos minutos". De esa manera, tampoco necesitan mantener su navegador abierto para mantener la solicitud en ejecución y, mientras tanto, pueden hacer otras cosas.

información relacionada