Lassen Sie uns zunächst analysieren, wie eine Sitzung in PHP generiert wird. Der Zweck des Sitzungsentwurfs besteht darin, verschiedene Zustände jedes Benutzers aufrechtzuerhalten, um die Mängel des HTTP-Protokolls (zustandslos) auszugleichen. Wir haben jetzt eine Frage. Wir alle wissen, dass die Sitzung auf dem Server gespeichert wird. Da sie zur Verwaltung des Status jedes Benutzers verwendet wird, stellt sich die Frage, was sie zur Unterscheidung von Benutzern verwendet. Zu diesem Zeitpunkt müssen Sie Cookies verwenden. Wenn wir session_start(); im Code aufrufen, generiert PHP jeweils eine Datei im SESSION-Speicherverzeichnis (Standard ist /tmp/) und im Cookie-Verzeichnis des Clients. Der Name der Sitzungsdatei lautet wie folgt:
Das Format ist sess_{SESSIONID}. Zu diesem Zeitpunkt gibt es keinen Inhalt in der Sitzungsdatei. Als wir diese beiden Codezeilen in session_start(); hinzugefügt haben:
$_SESSION['name'] = 'wanchun0222';$_SESSION['blog'] = 'coderbolg.net'; 这时文件就有内容了:
name|s:11:"wanchun0222";blog|s:13:"coderbolg.net";
Schau dir den Keks jetzt noch einmal an:
Sie können sehen, dass der Server automatisch ein Cookie für uns generiert hat und der Cookie-Inhalt eine Zeichenfolge ist. Tatsächlich ist diese Zeichenfolge {SESSIONID}. Vielleicht haben Sie bereits verstanden, dass PHP bei der Verwendung einer Sitzung zunächst eine eindeutige SESSIONID-Nummer generiert (z. B. 2bd170b3f86523f1b1b60b55ffde0f66) und dann im Standardverzeichnis unseres Servers eine Datei mit dem Dateinamen sess_{SESSIONID} generiert Gleichzeitig wird auf der Clientseite des aktuellen Benutzers ein Cookie generiert, dessen Inhalt bereits erwähnt wurde. Auf diese Weise generiert PHP für jeden Benutzer eine SESSIONID, was bedeutet, dass für jeden Benutzer eine Sitzungsdatei vorhanden ist. Wenn PHP zum ersten Mal eine Sitzung für einen Benutzer verwendet, schreibt es ein Cookie an den Client. Wenn der Benutzer ihn in Zukunft besucht, liest PHP die darin enthaltene SESSIONID aus Gehen Sie in das Sitzungsverzeichnis, um die Sitzungsdatei zu finden. Nachdem Sie es gefunden haben, wird es beim Aufruf von $_SESSION['blog'] angezeigt.
Wir verstehen das Generierungs- und Funktionsprinzip einer Sitzung und stellen fest, dass sich im Sitzungsverzeichnis viele Sitzungsdateien befinden. Natürlich dürfen diese Dateien nicht ewig existieren und PHP muss einen Mechanismus zur Wiederverwertung abgelaufener Dateien bereitstellen. In php.ini legt session.gc_maxlifetime die Lebensdauer für die Sitzung fest (Standard ist 1440s). Wenn die letzte Aktualisierungszeit der Sitzungsdatei die Überlebenszeit überschreitet, gilt die Sitzungsdatei als abgelaufen. Es wird beim nächsten Neustart der Sitzung gelöscht. Wann wird die nächste Sitzung recycelt? Dies hängt mit der Anzahl der PHP-Anfragen zusammen. Im internen Mechanismus von PHP wird der Recyclingmechanismus einmal ausgelöst, wenn PHP N-mal angefordert wird. Wie oft eine Anfrage ausgelöst wird, wird durch die folgenden zwei Parameter gesteuert:
session.gc_probability = 1session.gc_divisor = 100
这是php.ini的默认设置,意思是每100次PHP请求就有一次回收发生。概率是 gc_probability/gc_divisor 。我们了解了服务器端的session过期机制,再来看看客户端的cookie的过期机制。
如果cookie失效了浏览器自然发送不了cookie到服务器,这时即使服务器的session文件存在也没用,因为PHP不知道要读取哪个session文件。我们知道PHP的cookie过期时间是在创建时设置的,那么PHP在创建session的同时为客户端创建的cookie的生命周期是多久呢?这个在php.ini中有设置:session.cookie_lifetime 。这个值默认是0,代表浏览器一关闭SESSIONID就失效。那就是说我们把session.gc_maxlifetime和session.cookie_lifetime设置成同一个值就可以控制session的失效时间了。
由上面的介绍我们可以知道,如果用户关闭了cookie,那我们的session就完全没法工作了。是的,确实是这样。php中session的客户端存储机制只有cookie吗?不是的。既然我们的SESSIONID 不能通过cookie传递到各个页面,那我们还有另一个法宝,就是通过页面GET传值的方式。
PHP可以在cookie被禁用时自动通过GET方式跨页传递SESSIONID,前提是设置php.ini的session.use_trans_sid为1。这时当我们在客户端禁用了cookie时使用了session,并在当前页面通过点击链接到另一页面时,PHP会自动在链接上添加SESSIONID参数,像这样:nextpage.php?SESSIONID=2bd170b3f86523f1b1b60b55ffde0f66。我想你应该看到了这种方式的缺点:好像不够安全啊。
Das obige ist der detaillierte Inhalt vonVerstehen Sie den Sitzungs-Garbage-Collection-Mechanismus in PHP. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!