Mysql
 sql >> Base de données >  >> RDS >> Mysql

Annuler les requêtes AJAX en attente dans l'application PHP ?

Chaîne causale probable

  1. le serveur ne réalise pas que les requêtes XHR sont annulées, et donc les processus PHP correspondants continuent de s'exécuter
  2. ces processus PHP utilisent des sessions et empêchent l'accès simultané à cette session jusqu'à ce qu'ils se terminent

Solutions possibles

Aborder l'un des deux points ci-dessus rompt la chaîne et peut résoudre le problème :

  1. (a) ignore_user_abort est FALSE par défaut, mais vous pourriez utiliser un paramètre non standard. Redéfinissez ce paramètre sur FALSE dans votre php.ini ou appelez ignore_user_abort(false) dans les scripts qui gèrent ces requêtes interruptibles.

Inconvénient :le script se termine simplement. Tout travail en cours est abandonné, laissant éventuellement le système dans un état sale.

  1. (b) Par défaut, PHP ne détectera pas que l'utilisateur a interrompu la connexion jusqu'à ce qu'une tentative soit faite pour envoyer des informations au client. Faites echo quelque chose périodiquement au cours de votre script de longue durée.

Inconvénient :ces données factices peuvent corrompre la sortie normale de votre script. Et ici aussi, le script peut laisser le système dans un état sale.

  1. Une session PHP est stockée sous forme de fichier sur le serveur. Sur session_start() , le script ouvre le fichier de session en mode écriture, acquérant effectivement un verrou exclusif sur celui-ci. Les demandes suivantes qui utilisent la même session sont mises en attente jusqu'à ce que le verrou soit libéré. Cela se produit lorsque le script se termine, sauf si vous fermez explicitement la session. Appelez session_write_close() ou session_abort() dès que possible.

Inconvénient :une fois fermée, la session ne peut plus être écrite (sauf si vous rouvrez la session , mais c'est un hack quelque peu inélégant). De plus, le script continue de s'exécuter, gaspillant peut-être des ressources.

Je recommande définitivement la dernière option.