3

我知道这个问题已在 SO 中提出,我已经尝试了解决方案,但仍未解决。

PHP 在一段时间不活动后删除会话(我假设 24 分钟,因为它是默认设置并且似乎适合测试)。

我在所有页面中设置了以下代码:

ini_set('display_errors', 0);
$sessionCookieExpireTime = 2880000;
session_set_cookie_params($sessionCookieExpireTime);
ini_set('session.gc_maxlifetime', $sessionCookieExpireTime);

session_start();
echo ini_get('session.gc_maxlifetime'); //echos 2880000 as expected

但会话在 24 分钟(左右)不活动后仍会重置。

phpinfo() 为会话返回以下输出: 在此处输入图像描述

知道为什么这不起作用吗?(PHP 5.3.10)

谢谢

4

2 回答 2

5

尽管 Marc B answer 分享了一些很棒的见解,但它对我不起作用。我很确定我的脚本一切都很好,而且我的代码中的会话没有任何问题。

经过一场史诗般的斗争,我发现我的问题实际上是由于共享托管环境造成的。来自 PHP 文档:

“如果不同的脚本......共享相同的位置来存储会话数据,那么具有最小值的脚本将 [确定会话超时]”。

在这之后,问题就很明显了。一些脚本(托管在同一台服务器上)正在使用默认的 php.ini session.gc_maxlifetime 并且正在重置我的会话。

解决方案是在我的主机根目录下创建一个文件夹(确保它不能通过网络访问),为其设置正确的权限,然后使用 session.save_path 告诉 php 在哪里存储我的会话。就像是:

ini_set("session.gc_maxlifetime","21600"); // 6 hours
ini_set("session.save_path", "/your_home/your_sessions/");
session_start();

该网站提供了很好的见解:共享主机上的 php 会话

因此,如果您遇到此问题,请确保您遵循 Marc B 的建议,如果这不起作用,请尝试一下。

最良好的祝愿!!

于 2012-09-06T02:14:09.630 回答
3

您是否在每个使用会话的脚本中都执行此代码?ini_set 更改适用于执行它们的脚本,并且仅适用于该特定脚本的执行生命周期。

如果你想让它成为一个永久的全局更改,你必须修改 php.ini,或者将一些 php_values 指令放入 http.conf/.htaccess。

于 2012-09-03T16:49:20.767 回答