
Estou tentando configurar o Apache + PHP-FPM, no entanto, temos um script de longa execução que foi executado e eventualmente expirou, o que cortou o link entre o Apache e o FPM, derrubando todo o site...
Existe alguma maneira de evitar que todo o site fique inativo se o --idle-timeout for atingido?
FastCgiExternalServer /usr/lib/cgi-bin/php5-fcgi -socket /var/run/php5-fpm.sock -idle-timeout 18000 -pass-header Authorization
Responder1
A solicitação do Apache para php-fpmserá abortado quando o tempo limite for atingido. Assim também para o usuário. Se você deseja que o cliente final obtenha uma resposta, existem três possibilidades que vêm à mente:
- aumente seu valor de tempo limite (já que seu aplicativo PHP é mais lento que isso)
- tente tornar seu aplicativo PHP mais rápido para essa solicitação
- faça com que seu aplicativo PHP calcule o tempo que está demorando e responda com uma mensagem de erro se estiver demorando mais do que o valor do tempo limite
A solução nº 2 seria a escolha usual do desenvolvedor, IMHO.
Responder2
Scripts de longa execução não devem ser executados no navegador/Apache. Você deve executá-lo em segundo plano com PHP CLI em vez de FPM. Os scripts CLI não atingem o tempo limite e não interferem na operação do Apache.
Você pode agendar o script para ser executado regularmente usando cronjobs ou pode ativá-lo no navegador fazendo algo como escrever um arquivo temporário (por exemplo, colocar um arquivo chamado run_script
no diretório do seu site e removê-lo no final do seu script ) de definir um sinalizador em um banco de dados ou outro back-end.
Ao optar pela segunda maneira, você ainda precisa de um cronjob (que pode ser executado uma vez a cada minuto) que verifica a existência dessa entrada de arquivo/banco de dados e dispara o script quando ele é encontrado (você também pode criar um ouvinte que monitore isso constantemente, em vez de uma vez a cada minuto, mas isso é bastante intenso e provavelmente um exagero para a maioria dos casos de uso).
Depois de disparado, tudo o que você envia de volta aos usuários é apenas um aviso como "Aguarde, estamos processando sua solicitação. Verifique novamente em alguns minutos". Dessa forma, eles também não precisam manter o navegador aberto para manter a solicitação em execução e podem apenas fazer outras coisas enquanto isso.