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.