Ein häufiges, aber leicht übersehenes Problem bei der Verwendung von PHP zur Behandlung von Sitzungen ist, dass, wenn der Entwickler vergisst, Session_start () zu rufen, auch wenn Session_register_Shutdown () registriert ist, er wird feststellen, dass es nicht wie erwartet ausgeführt oder wirksam wird. Diese Situation verwirrt oft Anfänger. In diesem Artikel wird die Prinzipien hinter diesem Phänomen ausführlich analysiert und sie anhand von Codebeispielern erläutert.
PHP bietet einen vollständigen Satz von Sitzungsverwaltungsmechanismen für die Aufbewahrung von Benutzerinformationen zwischen mehreren Seitenanforderungen. Dieser Mechanismus beruht hauptsächlich auf drei Schlüsselfunktionen:
Session_Start () : Initialisieren Sie die Sitzung oder stellen Sie eine vorhandene Sitzung wieder her.
$ _Session : Wird verwendet, um Daten zwischen Skripten zu übergeben.
Session_register_Shutdown () : Registrieren Sie eine Funktion, die aufgerufen wird, wenn die Sitzung geschlossen ist und zur Durchführung der erforderlichen Aufräumarbeiten oder Schreibvorgänge verwendet wird.
Die Funktion von Session_register_Shutdown () besteht darin, eine Funktion zu registrieren, die automatisch aufgerufen wird, wenn die Sitzung geschlossen ist. Diese Funktion wird ausgeführt, wenn Session_write_close () aufgerufen wird, was normalerweise automatisch am Ende des Skripts von Session_start () durchgeführt wird. Diese Funktion wird normalerweise verwendet, um sicherzustellen, dass der Inhalt in $ _Session korrekt in den Sitzungsspeicher (Dateien, Datenbanken usw.) geschrieben werden kann.
session_register_shutdown();
register_shutdown_function(function () {
// Angenommen, wir wollen aufzeichnen session Verhalten speichern
file_put_contents("https://m66.net/log.txt", "Session shutdown triggered.\n", FILE_APPEND);
});
Wenn wir jedoch Session_start () nicht anrufen, tritt das erwartete Verhalten dieses Codes nicht auf.
Wenn Session_Start () nicht aufgerufen wird, initialisiert PHP die Sitzungsumgebung nicht. Auch wenn Session_register_Shutdown () aufgerufen wird, werden keine Sitzungsdaten zum Schreiben aufgeführt. Noch wichtiger ist, dass Session_write_close () nicht automatisch ausgelöst wird, da dieses Skript aus Sicht des PHP keine Sitzungen beteiligt.
Es ist wie zu versuchen, Daten zu speichern, ohne die Datei zu öffnen. Das System hat keine Ahnung, was Sie speichern möchten, und hat kein entsprechendes Speicherziel.
Der folgende Code zeigt dies:
session_register_shutdown(); // Registrierte eine Schließfunktion,Aber die Sitzung wurde nicht gestartet
$_SESSION['username'] = 'Alice'; // Es wird tatsächlich nicht wirksam werden
// Auch wenn es manuell genannt wird session_write_close() Ohne Erfolg,Weil session Noch nicht angefangen
session_write_close();
Nach der Ausführung des obigen Codes speichert $ _Session nichts und die registrierte Schließfunktion wird nicht aufgerufen oder ausgeführt.
Die Voraussetzung, um sicherzustellen, dass Session_register_Shutdown () ordnungsgemäß funktioniert, ist , dass Session_start () zuerst aufgerufen werden muss. Die empfohlenen Standardnutzungsmuster sind wie folgt:
session_start(); // Starten Sie die Sitzung richtig
session_register_shutdown();
$_SESSION['user_id'] = 123;
// Am Ende des Skripts,PHP Wird automatisch aufgerufen session_write_close()
// Dann auslösen session_register_shutdown Registrierte Funktionen
Diese Reihenfolge stellt sicher, dass der Sitzungsmechanismus ordnungsgemäß initialisiert wird, sodass die Funktion zum Shutdown -Hook wie geplant ausgeführt wird.
Session_register_Shutdown () ist ein leistungsstarkes Tool, funktioniert jedoch nicht unabhängig. Ohne Session_Start () kann es keine Rolle spielen, als ob eine nicht geöffnete Datei versucht, Inhalte zu schreiben. Stellen Sie sicher, dass Sie Session_start () anrufen, bevor Sie eine Sitzung im Zusammenhang mit Sitzungen verwenden. Dies ist nicht nur eine gute Angewohnheit, sondern auch der Schlüssel, um sicherzustellen, dass der Code zuverlässig ausgeführt wird.
Durch das Verständnis dieses Mechanismus können Entwickler gemeinsame Fallstricke vermeiden und robustere und wartbare PHP -Anwendungen aufbauen.