Tentando entender o timeout / arquitetura do Apache

2

Eu tenho um sistema CentOS Release 6.3 rodando o Apache httpd 2.2.15 e o PHP 5.3.3.

Meu site PHP está funcionando bem, exceto por uma consulta, que aparentemente atingiu um limite de tempo limite. A consulta agora leva mais de 60 segundos para ser executada e, como resultado, os navegadores dos usuários ficam esperando - por muito mais tempo, cerca de 5 minutos ou mais - antes de mostrar uma página em branco.

Isso me fez imaginar como o Apache / PHP funciona.

Eu configurei um simples caso de teste de script PHP que simplesmente faz o seguinte:

  • dormir por 55/65 segundos;
  • acrescente "ainda estou aqui!" para um arquivo no servidor;
  • imprima uma linha de HTML.

Quando o tempo limite é de 55 segundos, tudo funciona conforme o esperado; meu navegador gira esperando por 55 segundos e depois renderiza o HTML.

Quando eu definir o tempo limite para 65 segundos, o navegador gira por 5 minutos ou mais antes de mostrar uma página completamente em branco. Enquanto isso:

  • a linha de depuração "Ainda estou aqui" ainda é anexada ao arquivo no servidor, mostrando que o PHP foi bem executado;

  • o log de acesso do Apache também mostra que a consulta foi executada, retornando um código de status HTTP de 200 e o número correto de bytes que compõem o HTML;

  • não há erros registrados pelo Apache ou PHP.

Eu tentei alterar algumas configurações que pareciam relevantes:

  • a diretiva do Apache httpd.conf 'Timeout', de 60 a 120;

  • a configuração 'default_socket_timeout' para o php.ini, de 60 a 120.

Mas o caso de teste ainda era exatamente o mesmo; o navegador "pendurado", mesmo após a página retornar após 65 segundos. Este é o caso de várias versões do Firefox.

Alguém pode me ajudar a entender como as coisas estão funcionando aqui? E, em segundo lugar, como posso aumentar o limite de tempo limite para que minha consulta lenta leve mais de 60 segundos para ser executada e retorne com êxito seus resultados ao navegador?

Eu teria esperado que, se houvesse um limite no Apache - "não espere mais de 60 segundos para o PHP executar a consulta" - então ele retornaria algum tipo de erro para o navegador após 60 segundos decorrido ou de outro modo registre algum outro erro. Em vez disso, estou vendo o PHP rodando até a conclusão, o log de acesso do Apache me dizendo "ei, tudo correu bem, eu transmiti os 75 bytes de saída para o navegador", mas o próprio navegador fica lá, nunca recebendo essa saída. O que está sendo silenciosamente "desconectado"? Se o Apache nunca envia um erro e permite que o PHP seja executado até a conclusão, por que ele não envia os resultados de volta (como diz no log de acesso)?

Muito obrigado por qualquer ajuda.

    
por Brad 19.03.2013 / 22:57

1 resposta

1

Atualize todos os valores de 60 segundos no /etc/php.ini para 120 para testar. Se você reiniciou o Apache depois que a configuração foi alterada, e ainda tem um problema como descrito, então parece que o php está causando isso com base na descrição.

    
por 19.03.2013 / 23:48