【发布时间】:2017-05-20 07:57:24
【问题描述】:
前言:这是我an earlier question 的“发展”,他的回答最终并没有解决我的问题。但是通过尝试所有建议并尝试其他东西,我发现真正的问题是别的东西,所以我在这里重新提出我的问题
我有一个多年来一直正常工作的登录页面/系统,让用户保持登录状态,直到他/她关闭浏览器窗口或手动注销。但最近,仅在几分钟不活动后,会话 cookie/s 似乎就过期了,导致用户自动退出。
这发生在不同的浏览器和不同的操作系统上,PHP 版本是 5.6.29,最近发生了变化(之前是 5.5 甚至 5.3)。
我使用session_start() 在每个页面上创建和刷新会话。登录脚本首先检查用户名和密码,并从数据库中获取一些其他用户数据。这些其他数据和成功登录状态保存在会话变量中,如
$_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 在会话似乎过期后保持相同的值(我曾想过,因为会话变量已经消失)。但是会话并没有过期,只是会话变量消失了。在我的测试中,我尝试在某些页面上回显其中的一些变量,但我偶然发现,在它们已经消失(没有回显输出)之后,当我重新加载页面或几分钟后,它们重新出现换到另一个页面。
现在这就是我现在卡住的地方:这怎么会发生,尤其是:我能做些什么来防止这些变量玩捉迷藏?
(顺便说一句,我无权访问服务器设置 - 这是在共享网络空间上...)
【问题讨论】:
-
如果更改了 php 版本,请检查会话 cookie 寿命设置是否也被更改/修改。这就是我能从中得到的一切。
phpinfo()显示什么? -
检查 php.ini 设置,就像 @Fred-ii- 所说的那样,而且,我知道这听起来很傻,当你真正的意思是
$_SESSION[.....] == ....时,检查你的代码$_SESSION[.....] == ....一个非常常见的错过错字。 -
嗯,之前的猜测都无法解释为什么会话值会在一段时间后恢复。您是否使用默认会话存储? (这是文件系统)如果提供者的架构在负载均衡器后面有多台机器,那么您需要将会话存储在数据库表中。 (因为机器必须使用相同的db)
-
您使用的是什么会话存储机制?如果它是默认的(临时文件),那么在服务器上运行的一些维护/备份脚本可能会将会话数据作为垃圾删除,而另一个正在从备份中恢复数据。如果它使用数据库或内存缓存,那么这些服务器可能暂时不可用?这里只是推测
-
@Fred-ii- 感谢您的帮助!但是请考虑一下:数据(会话变量)在登录期间被写入其中 - 之后它们不会被更改,只会被读出。如果
tpm在任何时候被清空,它们就会丢失并且在几分钟后无法重新出现......
标签: php session session-variables