【发布时间】:2013-11-09 16:33:25
【问题描述】:
我使用这些行在 PHP 中激活我的会话:
session_name("DELogin");
session_set_cookie_params((60*60*24*14), "/", ".myweb.com");
session_start();
但是,会话随机在设置的过期时间(甚至浏览器会话)之前停止工作(似乎)。 如您所见,它应该持续 2 周。 是否有一些设置需要更改?
我无权访问 php.ini,但我可以通过 .htaccess 更改这些设置(对吗?)。
我看到了session.gc_probability、session.gc_divisor 和session.gc_maxlifetime,但我认为它应该可以在不改变这些设置的情况下工作。 (如果我应该改变这些,请回复)
提前致谢
编辑: 我尝试了 Eugen Rieck 和 Dan Walker 的建议,但均无济于事。 我在我的 .htaccess 文件中设置了设置,所以我不必在每个页面上都包含它们:
php_value session.gc_maxlifetime 1209600
php_value session.cookie_lifetime 1209600
php_value session.cookie_domain ".mydomain.com"
php_value session.name "DELogin"
php_value session.auto_start 1
但是,一段时间后它仍然被“清除”。 (调查导致发现会话仍然存在,但对$_SESSION['id'] 的测试结果为假,这应该是在用户未登录时)。
所以要么将$_SESSION['id'] 更改为false,要么删除会话并使用$_SESSION['id'] false 自动(重新)生成。
我该怎么办?
【问题讨论】:
-
您如何确定会话停止工作?代码中是否还有其他地方调用了
session_start或类似的东西可能会重置会话? -
@BotskoNet 好吧,我不知道。只有当用户注销他/她自己时,它才会破坏会话(我很确定它只在用户注销时才被调用)
-
根据您最近的帖子更新,不会使用相同的键重新创建会话,因此
$_SESSION['id']失去其价值是一个问题。在可能触及该值的所有内容附近运行一些调试语句,并找出可能会改变它的内容。 -
@BotskoNet 好的,我会的,但是“使用相同的密钥重新创建”是什么意思?我没有说它是用相同的键重新创建的。我只能看到 cookie 仍然存在,但这是合乎逻辑的,因为它应该因为
session.auto_start设置为1。 -
@BotskoNet 我找到了,但我什么也找不到。问题是,当我登录并将其留在页面(我们称之为)A 时,我可以无限刷新它,而不会破坏会话并因此被注销。但是,如果我将计算机留在页面 A 上一个多小时,然后刷新它,(显然我的会话已被破坏)并且我已注销。
标签: php .htaccess session garbage-collection