sql >> Base de Datos >  >> RDS >> Mysql

¿Cancelar las solicitudes AJAX pendientes en la aplicación PHP?

Cadena causal probable

  1. el servidor no se da cuenta de que las solicitudes XHR se cancelaron, por lo que los procesos PHP correspondientes siguen ejecutándose
  2. estos procesos de PHP utilizan sesiones y evitan el acceso simultáneo a esta sesión hasta que terminan

Posibles soluciones

Abordar cualquiera de los dos puntos anteriores rompe la cadena y puede solucionar el problema:

  1. (a) ignore_user_abort es FALSE por defecto, pero podría estar usando una configuración no estándar. Vuelva a cambiar esta configuración a FALSE en ti php.ini o llama a ignore_user_abort(false) en los scripts que manejan estas solicitudes interrumpibles.

Inconveniente:el script simplemente termina. Cualquier trabajo en curso se elimina, lo que posiblemente deje el sistema en un estado sucio.

  1. (b) De forma predeterminada, PHP no detectará que el usuario ha anulado la conexión hasta que se intente enviar información al cliente. Hacer echo algo periódicamente durante el curso de su secuencia de comandos de larga duración.

Inconveniente:estos datos ficticios pueden corromper la salida normal de su secuencia de comandos. Y aquí también, la secuencia de comandos puede dejar el sistema en un estado sucio.

  1. Una sesión de PHP se almacena como un archivo en el servidor. En session_start() , el script abre el archivo de sesión en modo de escritura, adquiriendo efectivamente un bloqueo exclusivo sobre él. Las solicitudes posteriores que utilizan la misma sesión se ponen en espera hasta que se libera el bloqueo. Esto sucede cuando finaliza el script, a menos que cierre la sesión explícitamente. Llame a session_write_close() o session_abort() lo antes posible.

Inconveniente:cuando está cerrada, la sesión ya no se puede escribir (a menos que reabra la sesión , pero esto es un truco algo poco elegante). Además, el script sigue ejecutándose, posiblemente desperdiciando recursos.

Definitivamente recomiendo la última opción.