
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:
- aumente su valor de tiempo de espera (ya que su aplicación PHP es más lenta que eso)
- Intente hacer que su aplicación PHP sea más rápida para esa solicitud.
- 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_script
en 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.