为什么我的PHP会话过早到期?

时间:2012-08-18 20:09:55

标签: php

根据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字节。)因此看起来会话文件没有被删除,但内容被删除。

2 个答案:

答案 0 :(得分:3)

会话数据未正确处理的原因有很多。最有可能的是,会话未在加载的每个页面上启动并使用数据。要解决此问题,请确保在调用或重定向到的每个页面上启动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()之前。

答案 1 :(得分:-1)

session_start()

之前添加此内容
ini_set('session.use_cookies', 1);
ini_set('session.cookie_lifetime', 300*24*60*60);

由于各种原因,基于文件的会话可能会在您的系统上被破坏。尝试使用基于数据库的会话,看看是否能解决问题。