前言:这是我的an earlier question的“发展”,他的答案最终没有解决我的问题。但通过尝试所有的建议,并尝试其他的东西,我发现真正的问题是别的,所以我在这里重新提出我的问题
我有一个已正常工作多年的登录页面/系统,让用户登录,直到他/她关闭浏览器窗口或手动注销。但是在最近几分钟不活动之后,会话cookie似乎到期,导致用户自动注销。
这种情况发生在不同的浏览器和不同的操作系统上,PHP版本是5.6.29,最近已经更改(在5.5甚至5.3之前)。
我使用session_start()
在每个页面上创建并刷新会话。登录脚本首先检查用户名和PW,并从数据库中获取一些其他用户数据。这些其他数据和成功登录状态保存在会话变量中,如
$_SESSION['username'] = $name;
$_SESSION['usertype'] = $type;
$_SESSION['login'] = "ok";
在其他页面上,我检查登录状态,如下所示:
session_start();
if(($_SESSION['login'] != "ok") OR ($_SESSION['usertype'] != "xxx")) {
header("Location: ../login.php"); /* redirects to login page if conditions are not true */
exit;
}
登录有效,登录用户可以进入其他页面一段时间,但经过一段时间(强烈变化)后,他/她似乎已退出(即重定向到尝试打开另一个页面时的登录页面。)
然后我注意到(在开发人员工具中)会话ID cookie在会话似乎已经过期之后保持相同的值(我以为,因为会话变量已经消失)。但会议没有到期,只有会话变量已经消失。在我的测试中,我尝试在某些页面上回显一些变量,而不是偶然地发现在他们已经消失(没有回声输出)后,他们重新出现几分钟后我重新加载页面或改为另一页。
现在我就陷入了困境:这怎么可能发生,尤其是:我能做些什么来阻止这些变量玩捉迷藏呢?
(顺便说一句,我无法访问服务器设置 - 这是在共享的网站空间上...)
答案 0 :(得分:1)
这不是解决方案,只是对我在评论中写到的案例的测试。你能试试吗?
<?php
$number = (int)$_GET["number"];
$temp_dir = "/tmp/lbtest123";
if (!is_dir($temp_dir)) {
if (!mkdir($temp_dir, 0777, true)) {
die("Can't create directory: $temp_dir");
}
}
file_put_contents($temp_dir."/".$number.".txt", "");
echo "<pre>\n";
print_r(glob($temp_dir."/*.txt"));
echo "</pre>";
将此复制到您的服务器。 它使用作为参数传递的数字在/ tmp / lbtest123文件夹中创建文件。然后列出已创建的文件。
用越来越多的数字来呼叫它,与你期望&#34;退出&#34;相同的时间。即将发生。例如:
示例结果:
Array
(
[0] => /tmp/lbtest123/1.txt
[1] => /tmp/lbtest123/2.txt
[2] => /tmp/lbtest123/3.txt
[3] => /tmp/lbtest123/4.txt
)
我希望它会在一段时间后显示出类似的内容:
Array
(
[2] => /tmp/lbtest123/4.txt
[3] => /tmp/lbtest123/5.txt
)
Array
(
[0] => /tmp/lbtest123/1.txt
[1] => /tmp/lbtest123/2.txt
[2] => /tmp/lbtest123/3.txt
[3] => /tmp/lbtest123/6.txt
)
答案 1 :(得分:1)
对于任何有兴趣的人:
显然@Crouching Kitten是对的 - 提供商有一个架构,在负载均衡器或类似的东西后面有多台机器,我无能为力。
所以我接受了他的建议,现在将以前会话变量的所有内容(连同会话ID)保存在我在该网站每页开头访问的数据库中。我还在那里保存了一个时间戳,每个包含相同会话ID的新查询都会更新,所以我可以设置一个cronjob,每隔半小时擦除过时的数据(超过90分钟 - 但是这个间隔可以是任何东西)。 / p>