O script PHP ocasionalmente aguarda de 20 a 30 minutos para iniciar

1

Eu tenho um script PHP no meu servidor que, principalmente, pega arquivos de um upload e os coloca no lugar. Geralmente funciona bem, mas ocasionalmente, o script não inicia por 20 a 30 minutos. Todos os arquivos enviados (aproximadamente 0,5 MB) estarão na pasta tmp durante a espera, então parece que a transferência de dados está completa. Aqui está um trecho do log de acesso do Apache indicando um POST para o script (de um aplicativo Android) ...

[29/Nov/2011:11:21:55 -0500] "POST /submit.php HTTP/1.1" 200 288 "-" "Apache-HttpClient/UNAVAILABLE (java 1.4)"

No entanto, essa entrada não aparece no log de acesso até 11:43 ou mais, cercada por outras solicitações de páginas de 11:43:42 e 12:00:02. Isso me leva a acreditar que a entrada não é escrita até que o script seja executado, mas está escrito com o tempo de submissão. Aqui está o log de erros, onde estou escrevendo eventos do script ...

[Tue Nov 29 11:43:19 2011] Script started: Nov 29, 2011 11:43:19
[Tue Nov 29 11:43:19 2011] Audio file provided
[Tue Nov 29 11:43:19 2011] Timestamp provided
[Tue Nov 29 11:43:19 2011] Defaults set
[Tue Nov 29 11:43:19 2011] Connected to database
[Tue Nov 29 11:43:19 2011] Database selected
[Tue Nov 29 11:43:19 2011] Query successful
[Tue Nov 29 11:43:19 2011] 551: ID set
[Tue Nov 29 11:43:19 2011] 551: Audio file moved
[Tue Nov 29 11:43:19 2011] 551: Algorithm succeeded
[Tue Nov 29 11:43:19 2011] 551: Algorithm query succeeded
[Tue Nov 29 11:43:19 2011] 551: Photo type identified
[Tue Nov 29 11:43:20 2011] 551: Photo and thumbnail saved
[Tue Nov 29 11:43:20 2011] 551: Cache cleared
[Tue Nov 29 11:43:20 2011] Script finished: Nov 29, 2011 11:43:20

Alguma idéia do que poderia fazer com que um script PHP não fosse executado por tanto tempo, ou que tipo de registro eu deveria colocar em prática para descobrir? O servidor está executando Ubuntu 10.04 , Apache 2.2.14 e PHP 5.3.2 .

    
por Neil 03.12.2011 / 15:59

1 resposta

1

Você está absolutamente correto sobre a maneira como o Apache escreve no arquivo de log. O registro de data e hora é definido quando o filho aceita a conexão, mas não é gravado no arquivo de registro até que a resposta seja enviada. Isso pode resultar em que os timestamps estejam completamente fora de ordem no arquivo de log.

Os logs do próprio script mostram que ele não começou a ser executado até 22 minutos após a conexão inicial ter sido feita, o que significa que isso é uma coisa do Apache e não uma coisa do PHP.

Meu primeiro palpite é que o upload dos dados estava demorando 20 minutos. 0,5MB normalmente não demoraria tanto e você disse que o arquivo inteiro parecia estar lá por 20 minutos, então isso pode não ser problema nosso.

O próximo palpite é um upload incompleto ou um upload completo sem nenhuma indicação de que ele foi concluído.

Se o Android App não estiver configurando ou estiver configurando incorretamente o cabeçalho Content-Length: Não tenho ideia de como o Apache saberá quando começar a processar os dados.

Se o usuário do Android ficar fora do alcance do sinal, a conexão TCP pode permanecer aberta por algum tempo.

A melhor aposta para tentar ver mais de perto os tempos envolvidos seria executar um tcpdump no seu servidor e verificar exatamente quando as diferentes partes da solicitação chegaram. Espero que não seja um servidor particularmente ocupado. Obviamente, quanto mais você pode limitar isso apenas para o tráfego que você quer, melhor. Certifique-se de usar a opção -w para que, uma vez que você saiba qual endereço IP causou o problema, você possa reler o arquivo e filtrar apenas o tráfego desse endereço IP.

    
por 03.12.2011 / 19:01