Provável cadeia causal
- o servidor não percebe que as solicitações XHR foram canceladas e, portanto, os processos PHP correspondentes continuam em execução
- esses processos PHP usam sessões e impedem o acesso simultâneo a esta sessão até que terminem
Soluções possíveis
Abordar qualquer um dos dois pontos acima quebra a cadeia e pode resolver o problema:
- (a)
ignore_user_abort
éFALSO
por padrão, mas você pode estar usando uma configuração não padrão. Altere esta configuração de volta paraFALSE
em vocêphp.ini
ou ligue paraignore_user_abort(false)
nos scripts que tratam dessas solicitações interrompíveis.
Desvantagem:o script simplesmente termina. Qualquer trabalho em andamento é descartado, possivelmente deixando o sistema em um estado sujo.
- (b) Por padrão, o PHP não detectará que o usuário abortou a conexão até que seja feita uma tentativa de enviar informações ao cliente. Faça
eco
algo periodicamente durante o curso de seu script de longa duração.
Desvantagem:esses dados fictícios podem corromper a saída normal do seu script. E aqui também, o script pode deixar o sistema em um estado sujo.
- Uma sessão PHP é armazenada como um arquivo no servidor. Em
session_start()
, o script abre o arquivo de sessão no modo de gravação, adquirindo efetivamente um bloqueio exclusivo nele. As solicitações subsequentes que usam a mesma sessão são colocadas em espera até que o bloqueio seja liberado. Isso acontece quando o script termina, a menos que você feche a sessão explicitamente. Chamesession_write_close()
ousession_abort()
o mais cedo possível.
Desvantagem:quando fechada, a sessão não pode mais ser gravada (a menos que você reabra a sessão , mas isso é um hack um tanto deselegante). Além disso, o script continua em execução, possivelmente desperdiçando recursos.
Eu definitivamente recomendo a última opção.