Analyse ungültiger PHP-Sitzungen
Während des PHP-Entwicklungsprozesses kann bei einigen Freunden häufig das Problem auftreten, dass die von der Sitzung generierten Dateien nicht automatisch gelöscht werden können Es ist wirklich unmöglich, diese Dateien zu löschen, aber es besteht ein Wahrscheinlichkeitsproblem. Solange Ihre Website ausreichend Datenverkehr hat, können diese Dateien automatisch gelöscht werden. Wenn die Anzahl der Besuche relativ gering ist und die Dateien nicht ansprechend sind, können Sie das automatische Löschen von Sitzungsdateien durch die Konfiguration von php.ini realisieren. Die spezifische Konfiguration lautet wie folgt:
Suchen
session.gc_probability = 1 session.gc_pisor = 1000
Die beiden oben genannten Parameter sind tatsächlich diese Wahrscheinlichkeit, die standardmäßig 1/1000 beträgt
Ändern Sie session.gc_pisor = 1000 in session.gc_pisor = 100
Wenn Sie eine vollständige Realität erreichen möchten -time , dann können Sie diesen Parameter auf 1 ändern, sodass die Wahrscheinlichkeit 100 % beträgt
Mal sehen, wie die Sitzung funktioniert
Übersicht: Jede PHP-Anfrage hat eine Wahrscheinlichkeit von 1/100 (Standard). Wert) löst „Session-Recycling“ aus. Wenn ein „Sitzungsrecycling“ auftritt, werden die /tmp/sess_*-Dateien überprüft. Wenn die letzte Änderungszeit 1440 Sekunden (den Wert von gc_maxlifetime) überschreitet, werden sie gelöscht, was bedeutet, dass diese Sitzungen abgelaufen sind.
1. Wie erfolgt die Sitzung auf der Serverseite (normalerweise Apache mit PHP-Modul)?
Standardmäßig speichert PHP die Sitzung im Verzeichnis /tmp und der Dateiname lautet wie folgt: sess_01aab840166fd1dc253e3b4a3f0b8381. Jede Datei entspricht einer Sitzung.
more /tmp/sess_01aab840166fd1dc253e3b4a3f0b8381 username|s:9:”jiangfeng”;admin|s:1:”0〃;
#Variablenname|Typ: Länge: Wert
Das Löschen der Sitzungsdatei hier bedeutet, dass die entsprechende Sitzung ungültig ist.
2. Wie erfolgt die Sitzung auf der Clientseite (normalerweise im Browser)?
Die Sitzung findet auf der Browserseite statt, Sie müssen nur die Sitzungs-ID (die eindeutige, von der Serverseite generierte ID) speichern. Es gibt zwei Möglichkeiten, es zu speichern: in Cookies und in URLs. Wenn die Sitzungs-ID im Cookie gespeichert ist, können Sie erkennen, dass im Cookie des Browsers eine PHPSESID-Variable vorhanden ist. Wenn es per URL übergeben wird, können Sie eine URL in der Form sehen:
index.php?phpsesid=01aab840166fd1dc253e3b4a3f0b8381. (Auf der Serverseite verwenden Sie session.use_cookies, um zu steuern, welche Methode verwendet wird)
3. Wie stellt PHP auf der Serverseite fest, ob die Sitzungsdatei abgelaufen ist?
Wenn die „letzte Änderungszeit“ auf „jetzt“ gc_maxlifetime (Standard ist 1440) Sekunden überschreitet, gilt diese Sitzungsdatei als abgelaufen, wenn die nächste Sitzung recycelt wird, wenn diese Datei noch vorhanden ist nicht geändert wurde, wird die Sitzungsdatei gelöscht (die Sitzung läuft ab).
Vereinfacht ausgedrückt: Wenn ich mich auf einer Website anmelde und innerhalb von 1440 Sekunden (Standardwert) keine Aktion erfolgt, gilt die entsprechende Sitzung als abgelaufen.
Eine Änderung der Variablen gc_maxlifetime in der Datei php.ini kann die Ablaufzeit der Sitzung verlängern: (Beispiel: Wir ändern die Ablaufzeit auf 86400 Sekunden)
session.gc_maxlifetime = 86400
Dann starten Sie einfach Ihren Webdienst (normalerweise Apache) neu.
Hinweis: In PHP5 verwendet der Sitzungsablauf einen Recyclingmechanismus. Die hier eingestellte Zeit beträgt 86400 Sekunden. Wenn die Sitzung nicht innerhalb von 86400 Sekunden geändert wurde, wird sie erst beim nächsten „Recycling“ gelöscht.
4. Wann findet das „Recycling“ der Sitzung statt?
Standardmäßig besteht für jede PHP-Anfrage eine Recyclingwahrscheinlichkeit von 1/100, sodass dies einfach so verstanden werden kann: „Für alle 100 PHP-Anfragen findet ein Recycling statt.“ Diese Wahrscheinlichkeit wird durch die folgenden Parameter gesteuert
#概率是gc_probability/gc_pisor session.gc_probability = 1 session.gc_pisor = 100
Hinweis 1: Nehmen Sie an, dass in diesem Fall gc_maxlifetime=120, wenn eine Sitzungsdatei zuletzt vor 120 Sekunden geändert wurde, dann das nächste Mal Diese Sitzung ist weiterhin gültig, bis eine Wiederverwertung (Wahrscheinlichkeit 1/100) erfolgt.
Hinweis 2: Wenn Ihre Sitzung session.save_path verwendet, um die Sitzung an anderer Stelle zu speichern, verarbeitet der Sitzungsrecyclingmechanismus möglicherweise nicht automatisch abgelaufene Sitzungsdateien. Zu diesem Zeitpunkt müssen Sie abgelaufene Sitzungen regelmäßig manuell (oder crontab) löschen:
cd /path/to/sessions; find -cmin +24 | xargs rm
5. Einige besondere Situationen
weil des Recycling-Mechanismus Die „Zeit der letzten Änderung“ der Datei wird überprüft. Wenn also eine Sitzung aktiv ist, sich der Inhalt der Sitzung jedoch nicht geändert hat, hat sich die entsprechende Sitzungsdatei nicht geändert, und der Recycling-Mechanismus berücksichtigt dies um eine Sitzung zu markieren, die schon lange nicht mehr aktiv war, und löschen Sie sie. Das möchten wir nicht sehen. Wir können dieses Problem lösen, indem wir den folgenden einfachen Code hinzufügen:
<?php if(!isset($_SESSION['last_access'])||(time()-$_SESSION['last_access'])>60) $_SESSION['last_access'] = time(); ?>
Der Code versucht alle 60 Sekunden, die Sitzung zu ändern.
Zusammenfassung: Wenn Sie die Ablaufzeit der Sitzung ändern möchten, ändern Sie einfach die Variable gc_maxlifetime. Die Sitzung von PHP5 verwendet einen passiven Recyclingmechanismus (Garbage Collection). Abgelaufene Sitzungsdateien verschwinden nicht von selbst, aber abgelaufene Sitzungen werden verarbeitet, indem das „Recycling“ ausgelöst wird.
Werfen wir einen detaillierten Blick auf einige andere Probleme beim Festlegen der Sitzungszeit
Parameter für die Ablaufzeit der Sitzung
Legen Sie die Parameter für die Ablaufzeit fest, hauptsächlich. Legen Sie einfach die fest Parameter von session.gc_maxlifetime. Für eine sicherere Einstellung legen Sie einfach die folgenden zwei Parameter fest
ini_set('session.cookie_lifetime', 0); // 可用 print_r(session_get_cookie_params()); 观察 ini_set('session.gc_maxlifetime', 3600); // 可用 echo ini_get("session.gc_maxlifetime"); 观察
session_cookie_lifetime 设为 0 的话, 代表等到 browser 才把此 cookie 清掉.(session 和 browser cookie 是有相关的)
如果懒得想这些, 直接用下面的 function 就可以了
Session 过期时间程式
<?php function start_session($expire = 0) { if ($expire == 0) { $expire = ini_get('session.gc_maxlifetime'); } else { ini_set('session.gc_maxlifetime', $expire); } if (empty($_COOKIE['PHPSESSID'])) { session_set_cookie_params($expire); session_start(); } else { session_start(); setcookie('PHPSESSID', session_id(), time() + $expire); } } ?>
使用方式
于程式最上方加入: start_session(600); // 代表 600 秒后会过期 (取代原本 session_start())
如果要再延长过期时间, 只要再做修改即可.
但是有个问题要注意, 就是 PHP 的 session 预设是存成 file, 所以 /tmp 可能会因这样设定而爆掉(档案太多), 通常解法是把 session 存进 DB/memcache 中.
以上就是php Session无效分析资料整理的详解的内容,更多相关内容请关注PHP中文网(www.php.cn)!