In PHP wird die Funktion Session_register_Shutdown () verwendet, um eine Rückruffunktion zu registrieren, die automatisch ausgeführt wird, wenn die Sitzung geschlossen ist. Theoretisch kann es uns helfen, Sitzungsdaten automatisch zu speichern, wenn das Skript ausgeführt wird. In der tatsächlichen Verwendung sind jedoch viele Entwickler auf ein Problem gestoßen: Selbst wenn Session_register_Shutdown () aufgerufen wird, können Sitzungsdaten immer noch nicht automatisch gespeichert werden, was dazu führt, dass Sitzungsinformationen verloren gehen oder rechtzeitig aktualisiert werden.
In diesem Artikel werden die Grundursachen dieses Problems im Detail analysiert und mehrere mögliche Lösungen bereitgestellt, mit denen Sie die automatische Einsparung von Sitzungen korrekt behandeln können.
Session_register_Shutdown () ist eigentlich eine relativ niedrige Funktion. Es wird automatisch Session_Write_Close () aufgerufen, wenn PHP die Sitzung schließt, um Sitzungsdaten zu speichern. Ab PHP 5.4 wurde diese Funktion jedoch als verworfen markiert und führt in einigen Umgebungen instabil, insbesondere wenn frühzeitige Aufrufe an Session_write_Close () oder Ausgabepuffervorgänge im Skript, session_register_shutdown () die speicherische Aktion nicht normal ausführen können.
Darüber hinaus ruft Session_register_Shutdown () nur dann automatisch Session_write_close () auf, wenn die Sitzung geschlossen ist. Wenn der Entwickler im Code aktiv Session_write_close () angerufen hat, wird die Auswirkung nachfolgender Anrufe ignoriert, was dazu führt, dass die Sitzung nicht korrekt geschrieben wird.
Angesichts der Tatsache, dass Session_register_Shutdown () veraltet wurde, wird empfohlen, Register_Shutdown_Function () direkt mit Session_Write_Close () kombiniert zu werden, um sicherzustellen, dass die Sitzung manuell aufgerufen wird, um zu speichern, wenn das Skript endet.
Beispielcode:
<?php
session_start();
// Am Ende des Skripts manuell retten session
register_shutdown_function(function() {
session_write_close();
});
// Überarbeiten session Daten
$_SESSION['user'] = 'Zhang San';
echo "Session Satz";
?>
Der Schlüssel hier ist die Verwendung von Register_Shutdown_Function () , die nach der Ausführung des Skripts anonyme Funktionen aufruft, wodurch sichergestellt wird, dass Session_write_close () aufgerufen wird und sichergestellt wird, dass Sitzungsdaten korrekt gespeichert werden.
Wenn Session_Write_Close () in anderen Teilen des Skripts aufgerufen wurde, kann der Anruf an Register_Shutdown_Function () oder Session_register_Shutdown () ungültig sein. Der Code muss überprüft werden, um wiederholte Anrufe zu vermeiden.
Beispielsweise führt der folgende Code dazu, dass die Sitzung automatisch nicht gespeichert wird:
<?php
session_start();
session_write_close(); // Früh geschlossen session
// Aufgerufen, wenn die Registrierung geschlossen ist,In der Tat wird es nicht wieder wirksam werden
session_register_shutdown();
$_SESSION['user'] = 'Li Si';
echo "Session Wahrscheinlich nicht gerettet";
?>
Die richtige Methode besteht darin, die im Voraus geschlossene Session_write_close () zu entfernen:
<?php
session_start();
session_register_shutdown();
$_SESSION['user'] = 'Li Si';
echo "Session Gerettet";
?>
Es wird jedoch empfohlen, die Schreibmethode der Lösung 1 zu ändern, um verworfene Funktionen zu vermeiden.
In vielen Szenarien ist es auch ein stabiler und einfacher Ansatz:
<?php
session_start();
$_SESSION['cart'][] = 'WarenA';
// Nach der Verarbeitung aller Geschäftslogik,Handbuch schreiben session
session_write_close();
echo "Einkaufswagen aktualisiert";
?>
Diese Methode ist kompatibler und vermeidet die Komplexität des Verlassenes der automatischen Registrierung.
Weitere Informationen zur PHP -Sitzungsverarbeitung finden Sie in der offiziellen Dokumentation:
<a href="https://m66.net/manual/zh/function.register-shutdown-function.php">PHP offiziell register_shutdown_function() dokumentieren</a>
Verwandte Tags:
session