Heim  >  Artikel  >  Backend-Entwicklung  >  PHP-Sitzungssteuerung: Vertiefendes Verständnis der Unterschiede und Verwendung zwischen Cookies und Sitzungen

PHP-Sitzungssteuerung: Vertiefendes Verständnis der Unterschiede und Verwendung zwischen Cookies und Sitzungen

齐天大圣
齐天大圣Original
2020-05-06 07:46:002328Durchsuche

Wenn es um die Sitzungskontrolle geht, werden die meisten Leute denken: „Ist das nicht einfach?“ Ist es nicht nur COOKIE und SESSION?

Es handelt sich tatsächlich um Cookies und Sitzungen, aber wissen Sie wirklich, wie man sie verwendet?

Während eines Vorstellungsgesprächs vor ein paar Jahren bin ich auf eine Frage wie diese gestoßen:

Wie kann sichergestellt werden, dass die Sitzung nach 1 Stunde abläuft?

Damals dachte ich, das sei nicht einfach, setze einfach gc_maxlifetime auf 3600. Der damalige Interviewer sagte, die Antwort sei falsch und es gebe keine Garantie dafür, dass sie nach einer Stunde ungültig sei. Natürlich hat er mir den Grund nicht verraten. Später, als ich zurückkam, suchte ich sorgfältig und fand es heraus.

Bevor wir diese Frage beantworten, wollen wir das Wissen über Cookies und Sitzungen bekannt machen.

Der Unterschied und Zusammenhang zwischen COOKIE und SESSION

Unterschiede bei den Speicherorten:

  • Cookie Speicherung Auf dem Client

  • wird die Sitzung auf dem Server gespeichert

Die Verbindung zwischen ihnen:

Wenn der Server geöffnet wird In der Sitzung, also nach

session_start();

, wird eine eindeutige ID (session_id) generiert und dem Client über den Antwortheader mitgeteilt. Nachdem der Client es erhalten hat, wird es im Cookie gespeichert. Wenn der Client erneut eine Anfrage initiiert, werden diese Informationen angezeigt. Nachdem er diese Informationen erhalten hat, geht der Server in das Verzeichnis, in dem die Sitzungsdatei gespeichert ist, um die entsprechende Datei zu finden, und nachdem er sie gefunden hat, extrahiert er die Sitzungsinformationen. Durch diesen Mechanismus identifiziert der Server die Identität des Clients.

Ohne Cookies hat die Sitzung also keine Bedeutung.

Nachdem wir die Beziehung zwischen Cookies und Sitzungen vorgestellt haben, sprechen wir über die Gültigkeitsdauer der Sitzung.

Garbage Collection von SESSION

Im Allgemeinen beträgt die standardmäßige Sitzungsgültigkeitsdauer von PHP 24 Minuten. Wenn der Client nach Ablauf dieser Zeit keine Anfrage gestellt hat, löst er möglicherweise den Garbage-Collection-Mechanismus aus und löscht abgelaufene Sitzungsdateien. Warum ist es möglich? Hier geht es um das Prinzip des Müllmechanismus.

Die Session Garbage Collection von PHP ist probabilistisch und die Wahrscheinlichkeit wird durch session.gc_probability und session.gc_diviso bestimmt. Die Wahrscheinlichkeit beträgt

session.gc_probability/session.gc_diviso

phps Standard gc_probability ist 1 und gc_divisos Standard ist 100, was bedeutet, dass die Wahrscheinlichkeit, die Garbage Collection für jede Anfrage auszulösen, 1/100 beträgt. Wenn unsere Website viele Besuche hat, können wir diese Wahrscheinlichkeit im Allgemeinen erhöhen, beispielsweise auf 1/1000, um die E/A-Vorgänge zu reduzieren.

Es ist noch ein weiterer Punkt zu beachten: Beispielsweise hat Kunde A zu diesem Zeitpunkt eine neue Sitzung erstellt (die Sitzung ist 10 Minuten lang gültig). Nach 8 Minuten sendete A eine weitere Anfrage. Wird seine Sitzung zu diesem Zeitpunkt in 2 oder 10 Minuten ablaufen?

Die Antwort ist in 10 Minuten. Denn nach der zweiten Anfrage änderte sich auch die Änderungszeit der Sitzungsdatei auf der Serverseite. Die Garbage Collection prüft den Zeitpunkt der letzten Änderung der Sitzungsdatei. Aber denken Sie noch einmal darüber nach: Wird auch die entsprechende Cookie-Gültigkeitsdauer aktualisiert? Leider wird die Gültigkeitsdauer der Cookies nicht aktualisiert.

Wie stellt man sicher, dass die Sitzungsdatei in einer Stunde abläuft?

Sehen wir uns nun die ursprüngliche Frage an: Wie stellt man das sicher? Die Sitzungsdatei läuft in einer Stunde ab. Die Speicherbereinigung der Sitzung ist ein probabilistisches Ereignis, sodass Sie sich nicht darauf verlassen können.

Kann die Gültigkeitsdauer des Cookies dann durch Setzen von cookie_lifetime festgelegt werden?

Die Antwort ist immer noch nein. Das Cookie ist auf der Client-Seite verschwunden. Es kann lediglich nicht mit der nächsten Anfrage übertragen werden, aber die entsprechende Sitzungsdatei ist noch vorhanden.

Tatsächlich besteht der einfachste Weg, dieses Problem zu lösen, darin, die Sitzung in Redis zu speichern und die Ablaufzeit des Redis-Schlüssels zu verwenden, um sicherzustellen, dass er innerhalb einer Stunde abläuft. Diese Methode ist auch eine empfohlene Methode

Aber wenn Sie nur PHP verwenden können, wie können Sie sie dann vervollständigen?

Sie können für jede Sitzung einen Zeitstempel festlegen und den Zeitstempel vor jedem Zugriff festlegen. Fügen Sie den Code ein:

<?php
session_start([
    &#39;cookie_lifetime&#39; => 3600,
    &#39;gc_maxlifetime&#39; => 3600
]);

if (isset($_SESSION[&#39;lifetime&#39;]) && $_SESSION[&#39;lifetime&#39;] > time()) {
    // 未过期,更新session的lifetime及cookie的有效期
    $_SESSION[&#39;lifetime&#39;] += 3600;
    $tmpVal = $_COOKIE[session_name()];
    setcookie(session_name(), $tmpVal, time() + 3600, &#39;/&#39;);
} else {
    // 过期删除
    $_SESSION = [];
    if (isset($_COOKIE[session_name()])) {
        setcookie(session_name(), &#39;&#39;, time() - 100, &#39;/&#39;);
    }
    session_destroy();
}

Nachdem ich diesen Inhalt gelesen habe, glaube ich, dass jeder ein tieferes Verständnis von PHP-Sitzungen haben sollte.

Das obige ist der detaillierte Inhalt vonPHP-Sitzungssteuerung: Vertiefendes Verständnis der Unterschiede und Verwendung zwischen Cookies und Sitzungen. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn