Heim  >  Artikel  >  php教程  >  So legen Sie die Sitzungsablaufzeit in PHP genau fest

So legen Sie die Sitzungsablaufzeit in PHP genau fest

高洛峰
高洛峰Original
2016-12-24 09:19:151339Durchsuche

In den meisten Fällen verwenden wir die Standardeinstellung für die Ablaufzeit der Sitzung, aber in einigen Fällen mit besonderen Anforderungen können wir die Ablaufzeit der Sitzung festlegen.

Hierfür können Sie php.ini in PHP festlegen und session.gc_maxlifetime = 1440 # finden (PHP5-Standard ist 24 Minuten)
Hier können Sie die Ablaufzeit nach Belieben festlegen nach der Einstellung scheint es nicht zu funktionieren! /1000 bedeutet, dass alle 1000 Mal nur eine Sitzung recycelt wird.
Solange Ihr Besuchsvolumen groß ist, können Sie den Recyclingeffekt erzielen

Oder Sie können auch den Wert von session.gc_divisor festlegen,
session.gc_probability = 1
session.gc_divisor = 1000
Zum Beispiel: session.gc_divisor = 1, was offensichtlich ist Sie können die Auswirkung des SESSION-Ablaufs sehen.


Die am häufigsten verwendete Einstellung befindet sich im PHP-Programm, wie im folgenden Beispielprogramm gezeigt:

Dies ist möglich, wenn Sie möchten um das abgelaufene festzulegen Es kann auch im Programm implementiert werden:

<?php
if(!isset($_SESSION[&#39;last_access&#39;])||(time()-$_SESSION[&#39;last_access&#39;])>60)
$_SESSION[&#39;last_access&#39;] = time();
?>
Sitzung hat einen Ablaufmechanismus:

session.gc_maxlifetime Es stellt sich heraus, dass der Sitzungsablauf ein Ereignis mit geringer Wahrscheinlichkeit ist. und session.gc_probability und session.gc_divisor werden verwendet, um die Wahrscheinlichkeit der Ausführung von gc in der Sitzung zu bestimmen. Die Standardwerte von session.gc_probability und session.gc_divisor sind 1 bzw. 100. sind Zähler und Nenner, sodass die Wahrscheinlichkeit, dass gc in der Sitzung ausgeführt wird, 1 % beträgt. Wenn Sie diese beiden Werte ändern, verringert sich die Effizienz von PHP. Dieser Ansatz ist also falsch! !
<?php
unset($_SESSION[&#39;last_access&#39;]);// 或 $_SESSION[&#39;last_access&#39;]=&#39;&#39;;
?>
Daher kann das Ändern der Variable gc_maxlifetime in der Datei php.ini die Ablaufzeit der Sitzung verlängern: (Beispiel: Wir ändern die Ablaufzeit auf 86400 Sekunden)

session.gc_maxlifetime = 86400

Starten Sie dann neu Ein Webdienst (normalerweise Apache) reicht aus.


Wann findet Sitzungs-„Recycling“ statt:

Standardmäßig besteht für jede PHP-Anfrage eine Recyclingwahrscheinlichkeit von 1/100, sodass dies einfach als „alle 100 Mal“ verstanden werden kann Für die PHP-Anfrage ist eine Sammlung aufgetreten.“ Diese Wahrscheinlichkeit wird durch die folgenden Parameter gesteuert

#Die Wahrscheinlichkeit ist gc_probability/gc_divisor


Hinweis 1: Nehmen Sie an, dass in diesem Fall gc_maxlifetime=120 ist, wenn eine Sitzungsdatei vorhanden ist letzte Änderung Die Zeit liegt vor 120 Sekunden, dann ist die Sitzung noch gültig, bis das nächste Recycling (1/100 Wahrscheinlichkeit) erfolgt.
session.gc_probability = 1
session.gc_divisor = 100

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:

Die Sitzung in PHP läuft nie ab

Das Programm nicht zu ändern ist der beste Weg, denn wenn Sie Ändern Sie das Programm, die Testabteilung muss sehr deprimiert sein, daher ist die einzige Möglichkeit, die Systemumgebungskonfiguration zu ändern, eigentlich sehr einfach. Öffnen Sie die Einstellungsdatei php.ini und ändern Sie die drei Zeilen wie folgt:
cd /path/to/sessions; find -cmin +24 | xargs rm

1. session.use_cookies

Der Wert hierfür ist auf 1 gesetzt und Cookies werden zum Übergeben der Sitzungs-ID verwendet

2 session.cookie_lifetime

Dies stellt die Zeit dar, zu der die Sitzungs-ID gespeichert wird im Client-Cookie ist der Standardwert 0, was bedeutet, dass der Browser die SessionID schließt. Aus diesem Grund können PHP-Sitzungen nicht dauerhaft verwendet werden. Stellen wir es also auf eine Zahl ein, die wir für groß halten, wie wäre es mit 999999999, das ist in Ordnung! das ist alles.

3. session.gc_maxlifetime

Dies ist die Zeit, die die Sitzungsdaten auf der Serverseite gespeichert werden. Wenn diese Zeit überschritten wird, werden die Sitzungsdaten automatisch gelöscht! Stellen wir ihn also ebenfalls auf 99999999 ein.

Das war's, alles ist in Ordnung. Wenn Sie es nicht glauben, testen Sie es einfach und sehen Sie - richten Sie eine Sitzung ein und kommen Sie nach zehneinhalb Tagen wieder, um zu sehen, ob Ihr Computer nicht in Ordnung ist ausgeschaltet oder heruntergefahren ist, können Sie die Sitzungs-ID weiterhin sehen.

Natürlich ist es auch möglich, dass Sie nicht die Berechtigung haben, den Server zu steuern, und nicht so viel Glück haben wie ich, die php.ini-Einstellungen zu ändern. Natürlich können wir uns darauf verlassen , wir müssen den Client zum Speichern von Cookies verwenden, den Wert dieses Cookies festlegen und diesen Wert dann an die Funktion session_id() übergeben. Die spezifische Methode lautet wie folgt:

<?php
session_start(); // 启动Session
$_SESSION[&#39;count&#39;]; // 注册Session变量Count
isset($PHPSESSID)?session_id($PHPSESSID):$PHPSESSID = session_id();
// 如果设置了$PHPSESSID,就将SessionID赋值为$PHPSESSID,否则生成SessionID
$_SESSION[&#39;count&#39;]++; // 变量count加1
setcookie(&#39;PHPSESSID&#39;, $PHPSESSID, time()+3156000); // 储存SessionID到Cookie中
echo $count; // 显示Session变量count的值
?>

Sitzungsfehler werden nicht weitergegeben


Schreiben wir zuerst eine PHP-Datei: 76a7362523f14d325042bbc57cd52892, und übergeben Sie es an den Server, um die Parameterkonfiguration des Servers anzuzeigen.

Gehen Sie zum Sitzungsabschnitt und stellen Sie sicher, dass der Parameter session.use_trans_sid auf Null gesetzt ist.

Dieser Parameter gibt an, ob die transparente SID-Unterstützung aktiviert werden soll, d. h. ob die Sitzung zusammen mit der URL übergeben wird. Nach meinem persönlichen Verständnis wird für jede URL eine Sitzung geöffnet, sobald dieser Parameter auf 0 gesetzt ist. Auf diese Weise können nachfolgende Seiten die Sitzung der vorherigen Seite nicht verfolgen, was wir als unzustellbar bezeichnen. Die beiden Seiten generieren zwei Sitzungsdateien auf der Serverseite und sind nicht miteinander verbunden. (Das genaue Prinzip muss hier bestätigt werden)

Eine Möglichkeit besteht also darin, den Wert von session.use_trans_sid in der Konfigurationsdatei php.ini auf 1 zu ändern.


Natürlich wissen wir, dass nicht jeder die Befugnis hat, die Konfiguration von PHP zu ändern. Was sind also die indirekten Lösungen?
Zwei Beispiele sollen zur Veranschaulichung dienen:
Datei 1 test1.php



<?php
//表明是使用用户ID为标识的session
session_id(SID);
//启动session
session_start();
//将session的name赋值为Havi
$_SESSION[&#39;name&#39;]="Havi";
//输出session,并设置超链接到第二页test2.php
echo "<a href="test2.php" rel="external nofollow" >".$_SESSION[&#39;name&#39;]."</a>";
?>

Datei 2: test2.php


<?php
表明是使用用户ID为标识的session
session_id(SID);
//启动session
session_start();
//输出test1.php中传递的session。
echo "This is ".$_SESSION[&#39;name&#39;];
?>

所以,重点是在session_start();前加上session_id(SID);,这样页面转换时,服务器使用的是用户保存在服务器session文件夹里的session,解决了传递的问题。
不过有朋友会反映说,这样一来,多个用户的session写在一个SID里了,那Session的价值就发挥不出来了。所以还有一招来解决此问题,不用加session_id(SID);前提是你对服务器的php.ini有配置的权限:
output_buffering改成ON,道理就不表了。
第二个可能的原因是对服务器保存session的文件夹没有读取的权限,还是回到phpinfo.php中,查看session保存的地址:

session.save_path: var/tmp

   


所以就是检查下var/tmp文件夹是否可写。
写一个文件:test3.php来测试一下:

<?php
echo var_dump(is_writeable(ini_get("session.save_path")));
?>

   


如果返回bool(false),证明文件夹写权限被限制了,那就换个文件夹咯,在你编写的网页里加入:

//设置当前目录下session子文件夹为session保存路径。
$sessSavePath = dirname(__FILE__).&#39;/session/&#39;;
//如果新路径可读可写(可通过FTP上变更文件夹属性为777实现),则让该路径生效。
if(is_writeable($sessSavePath) && is_readable($sessSavePath))
{
session_save_path($sessSavePath);
}

   


更多php中实现精确设置session过期时间的方法相关文章请关注PHP中文网!

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