Nachdem wir eine Sitzung mit Session_start () in PHP gestartet haben, müssen wir normalerweise nicht explizit Session_Write_Close () aufrufen, um Sitzungsdaten zu speichern. Selbst wenn das Skript auf halbem Weg beendet oder die Ausführung beendet, speichert PHP die Daten automatisch in $ _Session . Hinter diesem "automatischen" Mechanismus beruht er tatsächlich auf einem sehr kritischen Registrierungsmechanismus - Session_register_Shutdown () .
In diesem Artikel wird tief analysiert, wie die Funktion Session_register_Shutdown () und ihre Rolle im PHP -Lebenszyklus funktioniert und Ihnen dabei hilft, den automatischen Sparprozess von PHP klarer zu verstehen.
Session_register_Shutdown () ist eine von PHP bereitgestellte Funktion, mit der nach Start der Sitzung eine Heruntergangsfunktion registriert wird. Diese Funktion wird automatisch aufgerufen, wenn das Skript ausgeführt (oder abgebrochen) wird und verwendet wird, um die aktuellen Sitzungsdaten zu speichern. Die Kernfunktion besteht darin, sicherzustellen, dass die Daten in $ _Session weiterhin bestehen können, auch wenn das Skript abnormal ausgeht.
Äquivalent können wir es auch verstehen als:
session_register_shutdown();
// Äquivalent zu:
register_shutdown_function('session_write_close');
Mit anderen Worten, die interne Sitzung_register_Shutdown () verkaps tatsächlich das Verhalten von Register_Shutdown_Function ('Session_write_close') .
Wenn Sie standardmäßig Session_start () anrufen, um eine Sitzung zu starten, registriert PHP automatisch Session_register_Shutdown () . Schauen wir uns ein einfaches Beispiel an:
session_start();
$_SESSION['user'] = 'admin';
exit;
Auch wenn der Beenden auf Midway aufgerufen wird und das Skript nicht besitzt_write_close () manuell aufgerufen wird, werden die Informationen von User = Administrator erfolgreich in die Sitzungsdatei geschrieben. Dies liegt genau darauf, dass die von Session_register_Shutdown () registrierte Funktion in der Stillstandsphase ausgeführt wird.
PHP bietet Register_Shutdown_Function (), um einen Rückruf zu registrieren, wenn das Skript ausgeführt wird. Diese Rückrufe werden in den folgenden Situationen ausgeführt:
Das Skript wurde normal ausgeführt
Rufen Sie im Skript exit () oder sterben () an
In dem Skript traten tödliche Fehler auf (wie die Erschöpfung des Gedächtnisses usw. abhängig von der Situation)
Der Stillstand von PHP ist ungefähr wie folgt:
Alle Skriptlogik wurde ausgeführt
Führen Sie die registrierten Abschaltfunktionen aus (einschließlich Session_write_close )
Aufräumarbeiten wie Zerstörung von Variablen, Freigabe von Ressourcen usw.
Inhalt in den Client ausgeben
Daher wird die von Session_register_Shutdown () registrierte Funktion in diesem Schritt aufgerufen, um sicherzustellen, dass die Sitzungsdaten in jedem Exit -Modus korrekt gespeichert werden können.
In der Implementierung von Quellcode von PHP registriert Session_register_Shutdown () tatsächlich Session_write_Close () als Herunterfahren. Die Kernlogik finden Sie in Ext/Session/Session.c:
PHP_FUNCTION(session_register_shutdown)
{
php_session_register_shutdown();
}
Und PHP_Session_register_Shutdown () rufen auf:
register_shutdown_function("session_write_close", NULL);
Daher besteht die Essenz darin, eine Betriebsfunktion zu registrieren, die die Sitzung automatisch speichert, und wir schreiben manuell:
register_shutdown_function('session_write_close');
Es ist völlig äquivalent.
Obwohl PHP automatisch Session_write_close () aufruft, ist es eine Optimierungsmethode, es manuell in einigen Szenarien zu rufen. Zum Beispiel:
Veröffentlichen Sie die Sperre im Voraus : Die Sitzung von PHP basiert auf der Dateisperrung. Wenn Sie Session_Write_Close () erst aufrufen, wird die Sitzungsdatei bis zum Ende des Skripts gesperrt und möglicherweise andere Anfragen blockiert.
Gleichzeitige Anfrage : Wenn Sie über mehrere gleichzeitige Anfragen verfügen, die eine Sitzung betreiben müssen, aber nicht voneinander abhängen, können Sie die Session_Write_Close () sofort () $ _Session gelesen, um die Sperre zu veröffentlichen, um die Parallelität zu verbessern.
Verbesserung der Leistung : Die Veröffentlichung von Sitzungen so früh wie möglich in langjährigen Skripten kann unnötigen Ressourcenverbrauch vermeiden.
Beispiel:
session_start();
$user = $_SESSION['user'];
session_write_close(); // Lösen Sie das Schloss im Voraus
// Die nachfolgende Logik hat keinen Einfluss session Daten
file_get_contents('https://m66.net/api/do-something');
Hinter dem automatischen Sparmechanismus von PHP wird über die Funktion Session_register_Shutdown () implementiert. Es registriert eine Shutdown -Funktion, um Session_Write_Close () automatisch zu rufen, bevor das Skript endet, und sorgt so, dass die Sitzungsdaten korrekt gespeichert werden.
Das Verständnis dieses Mechanismus hilft uns nicht nur, robusteren Code zu schreiben, sondern bietet auch effektive Lösungen für die Leistungsoptimierung (z. B. in hohen Parallelitätsumgebungen). Die Beherrschung dieser zugrunde liegenden Details ist ein wichtiger Anbau für jeden hochrangigen PHP -Entwickler.