5 Stimmen

Was macht session_write_close, wenn man es vor einer Abfrage aufruft?

Ich frage mich, was session_write_close() macht. Ich finde das Handbuch etwas vage. Ich habe einige ziemlich große SELECT Abfragen. Bevor diese SELECT Abfragen ausgeführt werden, rufe ich session_write_close() auf und nach den Abfragen rufe ich wieder session_start() auf.

Sie fragen sich vielleicht, warum ich das mache. Wenn ich es nicht mache und ein Benutzer eine dieser SELECT Abfragen ausführt und sie abbricht (zum Beispiel versucht, eine andere Seite zu öffnen), kann der Benutzer die neue Seite nicht öffnen (oder muss ziemlich lange warten). Ich denke, das liegt daran, dass das Skript auf die Beendigung der großen Abfrage wartet.

Also meine Frage(n):
Was genau macht session_write_close(), wenn ich es vor einer Abfrage aufrufe?

Warum muss der Benutzer nicht warten (mit session_write_close() vor der Abfrage), wenn er eine neue Seite öffnet und die Abfrage abbricht?

Vielen Dank im Voraus

12voto

deceze Punkte 489288

Der Standard-Speicherort für Sitzungen in PHP ist einfach eine Datei auf der Festplatte. D.h. der Inhalt von $_SESSION wird einfach in eine Datei auf der Festplatte geschrieben. Wenn Sie session_start aufrufen, wird diese Datei gelesen und $_SESSION wird gefüllt, wenn das Skript endet, wird $_SESSION wieder auf die Festplatte geschrieben.

Es ist einfach, hier in eine klassische Wettlaufsituation zu geraten. Wenn zwei Anfragen parallel hereinkommen und zwei unabhängige Skripte aus der Datei lesen, und dann irgendwann später die beiden Skripte wieder in die Datei schreiben... wer gewinnt? Was wird der Inhalt der Datei sein, und kann es sein, dass einige Daten überschrieben wurden?

Die Lösung dafür ist die Dateisperrung. PHP sperrt die Sitzungsdatei und verhindert, dass jemand anderes darauf liest oder schreibt, bis die Sperre aufgehoben wird. Wenn zwei parallele Skripte gleichzeitig versuchen, eine Sperre zu erhalten, muss eines von ihnen warten, bis das andere fertig ist. Das ist, was Sie sehen.

session_write_close schreibt explizit den Inhalt von $_SESSION auf die Festplatte und hebt die Sperre auf.

4voto

Ja͢ck Punkte 165747

Ich hoffe, dass der unten stehende Graph hilft zu verstehen, was passiert; wir sprechen über eine Sitzung für denselben Benutzer (d.h. dieselbe Sitzungs-ID):

Skript a             | Sperre |    Skript b
---------------------+------+-----------------
start

Sitzung öffnen        <- | ja   |    start

etwas tun

Sitzung schließen      -> | ja   | -> Sitzung öffnen

schwere Abfragen ausführen  |       |    etwas tun

Sitzung öffnen        <- | ja   | <- Skript beendet

Skript beendet       -> | nein  |

Die Sitzung zu schließen, wenn Sie sie nicht verwenden werden, sei es für eine Weile oder bis das Skript endet, macht sie für ein anderes Skript verfügbar.

Beachten Sie, dass die Sitzungsdaten nach Ausführung des anderen Skripts möglicherweise verändert wurden.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X