会话的默认生命周期是多少?

Posted

技术标签:

【中文标题】会话的默认生命周期是多少?【英文标题】:What is the default lifetime of a session? 【发布时间】:2010-09-14 11:27:19 【问题描述】:

如果我点击了一个调用session_start() 的页面,我需要等待多长时间才能在刷新页面时获得新的会话 ID?

【问题讨论】:

另请参阅:***.com/questions/520237/… 【参考方案1】:

查看 php.ini,为 session.gc_maxlifetime 设置的值是以秒为单位的 ID 生命周期。

我相信默认是 1440 秒(24 分钟)

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

编辑:正如一些 cmets 指出的那样,上述内容并不完全准确。此处提供了有关为什么以及如何实现会话生命周期的精彩解释:

How do I expire a PHP session after 30 minutes?

【讨论】:

-1,不是问题的正确答案。常见的误解。 @chris 你为什么不建议一个替代答案? 正如布兰农所写,这是完全错误的,不应该是选择的答案。这个值告诉垃圾收集器如何表现,而不是你的会话存在多长时间。如果您不添加一些机制,会话将永远存在。关键是自己处理会话生命周期(即在一段时间不活动后删除会话数据)并将 session.gc_maxlifetime 设置为更大或相等的值。 kontur 在这一点上提出了最佳答案,但请取消验证此答案,它甚至会导致安全问题。 错误答案,这只设置了无效会话文件被删除/“垃圾收集”的时间。设置得更高不会延长用户会话。【参考方案2】:

session.gc_maxlifetime 指令(“gc”用于垃圾回收)在 php.ini 中的默认值为 1440 秒或 24 分钟。请参阅手册中的会话运行时配置页面:

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

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

php_value session.gc_maxlifetime "3600"

如果您使用的是共享主机,或者您托管了多个未更改默认设置的站点,请务必小心。默认会话位置是 /tmp 目录,垃圾收集例程将每 24 分钟为这些其他站点运行一次(并在此过程中清除您的会话,无论它们应该保留多长时间) .请参阅手册页上的note 或this site 以获得更好的解释。

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

【讨论】:

-1,不是问题的正确答案。常见的误解。 gc 收集的会话文件不会使 php 生成新的会话 id,即使会话保存到自己的目录,时间限制也不可靠。【参考方案3】:

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

编辑: 就像马丁之前写的一样

【讨论】:

【参考方案4】:

据PHP.net 网站上的用户称,他保持会话活动的努力失败了,因此他不得不采取一种解决方法。

<?php

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

$DirectoryPath = dirname(__FILE__) . "$separatorSessionData";
//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”。

【讨论】:

【参考方案5】:

你也可以使用ini_set('session.gc_maxlifetime', 28800); // 8 * 60 * 60 之类的东西。

【讨论】:

【参考方案6】:

但请注意,在大多数 xampp/ampp/...-setup 和一些 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

【讨论】:

以上是关于会话的默认生命周期是多少?的主要内容,如果未能解决你的问题,请参考以下文章

HttpSession会话状态的生命周期

cookie超过生命周期后会失效,问题是失效是指cookie文件被删还是浏览器不再使用该cookie但文件仍在

了解 ASP.Net 会话生命周期

Spring CSRF 令牌生命周期

Oracle SQL 会话的生命周期是啥?

如何设置会话的生命周期