Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

Cancelar solicitações AJAX pendentes no aplicativo PHP?

Provável cadeia causal

  1. o servidor não percebe que as solicitações XHR foram canceladas e, portanto, os processos PHP correspondentes continuam em execução
  2. 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:
  1. (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 para FALSE em você php.ini ou ligue para ignore_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.
  1. (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.
  1. 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. Chame session_write_close() ou session_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.