一个会话的默认生命周期是多久?

71

如果我访问调用了session_start()的页面,在刷新页面之前,我需要等多久才能获得一个新的会话ID?


4
另外,如需更详细的答案,请参见:https://dev59.com/1XRB5IYBdhLWcg3wxZ1K - kontur
6个回答

65

22
@chris,为什么不提出另一种答案呢? - Brannon
5
正如Brannon所写,这完全是错误的,不应选择此答案。这个值告诉垃圾回收器如何行动,与会话的存在时间无关。如果没有添加某些机制,会话可能永远存在。关键在于自己处理会话的生命周期(即在一段时间内删除会话数据)并将session.gc_maxlifetime设置为更大或相等的值。在这一点上,kontur提供了最佳答案,但请取消验证此答案,因为它甚至会导致安全问题。 - Ninj
3
答案错误,这只是设置无效会话文件被删除/“垃圾回收”的时间。将其设置得更高不会延长用户会话。 - Manuel Arwed Schmidt

28

在php.ini中,“session.gc_maxlifetime”指令(“gc”代表垃圾回收)的默认值为1440秒或24分钟。请参阅手册中的“Session Runtime Configuation”页面:

http://www.php.net/manual/en/session.configuration.php

如果您可以访问php.ini或.httpd.conf文件,或者本地站点的.htaccess文件,则可以更改此常量。要使用.htaccess方法将超时设置为一小时,请在站点根目录中的.htaccess文件中添加此行:

php_value session.gc_maxlifetime "3600"

如果您正在使用共享主机或者您主机上有多个站点且未更改默认设置,请注意。默认的会话位置是 /tmp 目录,并且用于这些其他站点的垃圾回收程序将每 24 分钟运行一次(并清除您的会话,无论它们应该保留多长时间)。请参阅手册页面上有关 说明此网站 获取更好的解释。

解决方法是将您的会话迁移到另一个目录,使用 session.save_path。这也有助于防止坏人从默认的 /tmp 目录中劫持访问者的会话。


4
这不是问题的正确答案,这是一个常见的误解。进行垃圾回收的会话文件不会使PHP生成新的会话ID,即使将会话保存到自己的目录中,时间限制也不能保证可靠。 - goat

6

这取决于您的php设置...
使用phpinfo()并查看会话章节。有像session.gc_maxlifetimesession.cache_expiresession.cookie_lifetime这样的值,它们会影响会话的生命周期。

编辑: 就像Martin之前写的那样


4
根据PHP.net网站上的用户表示,他尝试保持会话活动失败了,因此他不得不想出一个解决方法。
<?php

$Lifetime = 3600;
$separator = (strstr(strtoupper(substr(PHP_OS, 0, 3)), "WIN")) ? "\\" : "/";

$DirectoryPath = dirname(__FILE__) . "{$separator}SessionData";
//in Wamp for Windows the result for $DirectoryPath
//would be C:\wamp\www\your_site\SessionData

is_dir($DirectoryPath) or mkdir($DirectoryPath, 0777);

if (ini_get("session.use_trans_sid") == true) {
    ini_set("url_rewriter.tags", "");
    ini_set("session.use_trans_sid", false);

}

ini_set("session.gc_maxlifetime", $Lifetime);
ini_set("session.gc_divisor", "1");
ini_set("session.gc_probability", "1");
ini_set("session.cookie_lifetime", "0");
ini_set("session.save_path", $DirectoryPath);
session_start();

?>

在SessionData文件夹中,将存储文本文件以保存会话信息,每个文件的名称类似于“sess_a_big_hash_here”。

3
您可以使用类似于 ini_set('session.gc_maxlifetime', 28800); // 8 * 60 * 60 的方法。

1

但要注意,在大多数xampp/ampp/...设置和一些Linux发行版中,它的值为0,这意味着该文件直到您在脚本中删除它(或通过shell)才会被删除。

PHP.INI:

; Lifetime in seconds of cookie or, if 0, until browser is restarted.
; http://php.net/session.cookie-lifetime
session.cookie_lifetime = 0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接