Link do Apache e do FPM cortado pelo tempo limite do script

1

Eu estou tentando configurar o Apache + PHP-FPM, no entanto, temos um script de execução longa que foi executado e acabou com o tempo limite, o que separou o link entre o Apache e o FPM, derrubando todo o site ...

Existe alguma maneira de impedir que o site inteiro seja desativado se o tempo limite --idle for atingido?

FastCgiExternalServer /usr/lib/cgi-bin/php5-fcgi -socket /var/run/php5-fpm.sock -idle-timeout 18000 -pass-header Authorization
    
por Jeffrey L. Roberts 27.08.2018 / 06:43

2 respostas

2

O pedido do Apache para o php-fpm será abortado quando o tempo limite for atingido . Assim, para o usuário também. Se você quer que o cliente final obtenha uma resposta, há três possibilidades que vêm à mente:

  1. aumenta seu valor de tempo limite (já que seu aplicativo PHP é mais lento que isso)
  2. tente tornar seu aplicativo PHP mais rápido para essa solicitação
  3. 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 seu valor de tempo limite

A solução # 2 seria a escolha habitual do desenvolvedor IMHO.

    
por 06.09.2018 / 21:27
0

Scripts de execução longa não devem ser executados no navegador / Apache. Você deve executá-lo em segundo plano com o PHP CLI em vez do FPM. Os scripts da CLI não têm tempo limite e não interferem na operação do Apache.

Você pode programar o script para ser executado regularmente usando cronjobs ou pode ativá-lo do navegador fazendo algo como escrever um arquivo temporário (por exemplo, colocar um arquivo chamado run_script no diretório do 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 verifique a existência dessa entrada de arquivo / banco de dados e dispare o script quando ele for encontrado (você também pode criar um listener que monitora isso constantemente, em vez de uma vez a cada minuto, mas isso é bastante intensivo e provavelmente excessivo para a maioria dos casos de uso).

Depois de disparar tudo o que você envia de volta para seus 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 fazer outras coisas enquanto isso.

    
por 07.09.2018 / 12:16