2009-03-31 5 views
6

Jedes Mal, wenn ich auf Daten in $ _SESSION zugreife, aktualisiert es sofort die Sitzungsdatei auf der Festplatte oder nur einmal, wenn der Prozess ausfällt? Oder jede n Bytes Daten ändern (flush)?

Diese Frage bezieht sich nicht unbedingt auf den spezifischen Dateisitzungshandler, sondern auf jeden Handler. (Ruft jede Berührung in der Sitzung sofort eine E/A beliebiger Art auf, neben dem Speichern einer normalen Variablen im Speicher).

Antwort

3

Wie Matt schreibt, schreibt es standardmäßig am Ende der Skriptausführung. Sie können in session_write_close()

Session darüber hier lesen Daten in der Regel nach Ihr Skript ohne Notwendigkeit beendet gespeichert session_write_close() aufzurufen, aber als Sitzungsdaten zu verhindern nur eine gleichzeitige Schreiben gesperrt ist Skript kann auf einer Sitzung bei jeder Zeit arbeiten. Wenn Sie Framesets zusammen mit Sitzungen verwenden, werden Sie die Frames nacheinander durch diese Verriegelung laden. Sie können die Zeit reduzieren, die benötigt wird, um alle Frames zu laden, indem Sie die Sitzung beenden, sobald alle Änderungen an Sitzungsvariablen vorgenommen werden.

0

Hängt vom Handler ab. Sie können Ihren eigenen Handler schreiben, um sicherzustellen, dass dies nur so oft geschieht, wie Sie möchten, wenn Sie absolut sicher sein wollen. Es gibt 6 Callbacks zur Verwaltung von Sitzungsvariablen. Derjenige, der "Schreiben" genannt wird, muss keine echten E/A ausführen, und das Schreiben der Sitzungsdatei könnte warten, bis der Aufruf "Schließen". Es ist ein Implementierungsdetail, das, wie gesagt, vom Handler abhängt.

+0

Sagen Sie den Prozessabsturz, ich nehme an, die ungeschriebenen Sitzungsdaten sind verloren, richtig? –

+0

Ja, und vermutlich gehen auch nicht festgeschriebene Datenbankaktionen verloren. – jmucchiello

2

Es schreibt es und das Ende des Prozesses auf meinem Setup. Ich habe eine neue _ SESSION_ write_method:

public function _session_write_method($id, $sess_data) { 
    var_dump(file_put_contents('/var/www/public_html/testing.txt', serialize($sess_data))); 
    return(true); 
} 

und dann:

$_SESSION['foo'] = 'bar'; 
while(true) 

ich das Skript ausgeführt, wartete ein paar Sekunden, und dann lief 'sudo Kill' auf die Prozess-ID. Es hat die serialisierten Daten nicht in die Datei geschrieben. Ich habe es wieder ohne die Endlosschleife ausgeführt und ich habe: int (22) ganz unten auf der Seite und testing.txt wurde erfolgreich geschrieben und enthielt: s: 14: "foo | s: 3:" bar ";" ;