Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Ausstehende AJAX-Anforderungen in der PHP-App abbrechen?

Wahrscheinliche Kausalkette

  1. Der Server erkennt nicht, dass die XHR-Anforderungen abgebrochen werden, und daher laufen die entsprechenden PHP-Prozesse weiter
  2. Diese PHP-Prozesse verwenden Sitzungen und verhindern den gleichzeitigen Zugriff auf diese Sitzung, bis sie beendet werden

Mögliche Lösungen

Wenn Sie einen der beiden oben genannten Punkte ansprechen, wird die Kette unterbrochen und das Problem möglicherweise behoben:

  1. (a) ignore_user_abort ist FALSE standardmäßig, aber Sie könnten eine nicht standardmäßige Einstellung verwenden. Ändern Sie diese Einstellung wieder auf FALSE in Ihrer php.ini oder rufen Sie ignore_user_abort(false) auf in den Skripten, die diese unterbrechbaren Anfragen verarbeiten.

Nachteil:Das Skript wird einfach beendet. Alle laufenden Arbeiten werden verworfen, wodurch das System möglicherweise in einem unsauberen Zustand zurückbleibt.

  1. (b) Standardmäßig erkennt PHP nicht, dass der Benutzer die Verbindung abgebrochen hat, bis versucht wird, Informationen an den Client zu senden. Führen Sie echo aus etwas regelmäßig während des Verlaufs Ihres lang laufenden Skripts.

Nachteil:Diese Dummy-Daten können die normale Ausgabe Ihres Skripts beschädigen. Und auch hier kann das Skript das System in einem unsauberen Zustand hinterlassen.

  1. Eine PHP-Session wird als Datei auf dem Server gespeichert. Auf session_start() , öffnet das Skript die Sitzungsdatei im Schreibmodus und erwirbt effektiv eine exklusive Sperre darauf. Nachfolgende Anforderungen, die dieselbe Sitzung verwenden, werden angehalten, bis die Sperre aufgehoben wird. Dies geschieht, wenn das Skript beendet wird, es sei denn, Sie schließen die Sitzung ausdrücklich. Rufen Sie session_write_close() auf oder session_abort() so früh wie möglich.

Nachteil:Wenn geschlossen, kann die Sitzung nicht mehr geschrieben werden (es sei denn, Sie öffnen die Sitzung erneut , aber das ist ein etwas uneleganter Hack). Außerdem läuft das Skript weiter und verschwendet möglicherweise Ressourcen.

Ich empfehle auf jeden Fall die letzte Option.