Wahrscheinliche Kausalkette
- Der Server erkennt nicht, dass die XHR-Anforderungen abgebrochen werden, und daher laufen die entsprechenden PHP-Prozesse weiter
- 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:
- (a)
ignore_user_abort
istFALSE
standardmäßig, aber Sie könnten eine nicht standardmäßige Einstellung verwenden. Ändern Sie diese Einstellung wieder aufFALSE
in Ihrerphp.ini
oder rufen Sieignore_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.
- (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.
- 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 Siesession_write_close()
auf odersession_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.