为什么我的 PHP 会话提前过期


why is my PHP session expiring prematurely?

根据Chrome,我网站的PHPSESSID cookie过期时间设置为:

Expires:    Monday, November 26, 2012 2:46:39 PM

但会话仅在几个小时后过期。我在每一页上调用session_start((。为类似问题提供的阅读解决方案,我尝试设置

ini_set("session.cache_expire",300*24*60*60);

ini_set("session.gc_maxlifetime",100*24*60*60);

session_start()之前,但这并没有解决问题。(它们的初始值分别设置为 180 和 1440。

我在共享服务器上,另一个建议是更改默认的tmp目录,使其不是root(某些垃圾收集过程可能会删除cookie(,所以我这样做了

$docroot = $_SERVER['DOCUMENT_ROOT'];
$tmpdir = "$docroot/tmpx";
session_save_path($tmpdir);

这并不能解决问题。(我在其他浏览器中也有同样的问题,而不仅仅是Chrome。我可能还做错了什么?

更新:我在本地保存了当前会话的文件,然后在几个小时后尝试登录。虽然 Chrome 中的 PHPSESSID cookie(即其内容是此会话文件名的 cookie(仍按预期存储在未来 100 天的日期,但服务器上的实际会话文件现在不包含任何数据。(它存在,但它是 0 字节,而不是以前的 192 字节。因此,看起来会话文件没有被删除,但内容被删除了。

会话数据未正确处理的可能原因有很多。 最有可能的是,会话没有在每个加载并使用数据的页面上启动。 要解决此问题,请确保在调用或重定向到的每个页面上启动 session_start((。 此外,如果对会话配置进行任何更改(例如,ini_set(((,请确保全局或在每个页面上应用该更改。 要全局应用它,请添加

php_flag session.gc_maxlifetime <your value>
php_flag session.cache_expire <your value>

到您的 .htaccess 文件。 或者,您可以添加

ini_set("session.gc_maxlifetime", <value>);
ini_set("session.cache_expire", <value>);

在每个调用 session_start(( 的页面上的 session_start(( 之前。

session_start()之前添加以下内容:

ini_set('session.use_cookies', 1);
ini_set('session.cookie_lifetime', 300*24*60*60);

由于多种原因,系统上基于文件的会话可能会中断。尝试使用基于数据库的会话,看看是否可以解决问题。