【发布时间】:2013-12-29 10:19:29
【问题描述】:
我遇到了一个非常奇怪的问题,希望有一个非常简单的解释,但经过数小时的调试,我无法弄清楚发生了什么。
使用 LAMP 堆栈,php 5.4
这是系统的简化版本,它仍然会重现一些奇怪的行为。
在一个简单的自制框架中,我制作了一个水平菜单(选项卡),它“记住”当该选项卡中的页面用于搜索等时,哪个 url 处于活动状态。因此,如果您稍后返回该选项卡,您立即可以看到最后的搜索结果,因为get参数。
因此,菜单中的一个“选项卡”在此 URL 上激活:
/customer/2/customer_email/
这个变量被放入一个会话变量中: $_SESSION['tab_menu']['customer_email'] = $_SERVER['REQUEST_URI'];
页面刷新或导航到另一个选项卡后,可以从会话中读取选项卡的 url。但由于某种原因,存储的 url 更改为:
/customer/2/customer_email/532142118
如果我把 GET 参数放在 url 后面,同样的奇怪数字会被...插入任何进程。 因此,如果我使用此 url 访问选项卡:
/customer/2/customer_email/?foo=bar
会话数组在同一页面加载时将如下所示:
$_SESSION['tab_menu']['customer_email'] = /customer/2/customer_email/?foo=bar
但是在我导航到另一个页面后,会话数据将显示:
$_SESSION['tab_menu']['customer_email'] = /customer/2/customer_email/532142118
我在代码的最后一点通过 var_dump($_SESSION) 验证了 $_SESSION 数组看起来没问题。 我通过在代码开头的 session_start() 之后转储数据来验证下一次刷新的 $_SESSION 数据已更改。
如果我这样做,为了测试,会话数据中不会添加奇怪的数字:
$_SERVER['REQUEST_URI'] = '/customer/2/customer_email/';
如果我导航到另一个 url,则不会出现同样的问题:
/customer/3/customer_email/
我尝试了更多的东西: C
- 更改了会话数组中使用的键,但这没关系。
- 在具有相同设置的另一台服务器上进行了测试,但也没有出现这种情况。
- 尝试在将 url 放入会话数组后立即写入会话数据,但这也解决不了任何问题。
- 使用 strcmp()、strcasecmp() 将变量 $_SERVER['REQUEST_URI'] 与字符串 '/customer/2/customer_email/' 进行比较,在 Notepad++ 中显示为十六进制字符,在 PHP 中使用显示为十六进制字符在 stackoverflow 或 php.net 上找到函数
- 尝试在将 URL 放入 $_SESSION['tab_menu']['customer_email'] 之前对其进行序列化,但随后数字 532142118 只是神奇地添加到序列化数据中。
- 尝试对数字 532142118 进行解码,但无法将其与任何事物相关联。两周没有变化。
- 重新启动服务器
- 几乎完全重写了控制“选项卡”的逻辑,系统仍然挂在该服务器变量上。
问题:
- 什么在改变会话数据?如何进一步调试?
- 为什么不是所有网址都出现这种情况?几年来,我在几个标签上都使用了这个系统,这是第一次出现这种奇怪的行为。
- 为什么在使用 $_SERVER 变量时会出现这种情况,而不是在将其添加为自键入字符串时出现?
- 这个数字是什么意思? 532142118
希望得到一些反应/输入!
编辑: 将第 7 点和第 8 点添加到“我尝试过的事情”中
【问题讨论】:
-
mysql> SELECT from_unixtime(532142118);提供1986-11-12 06:45:18如果有帮助的话。 -
您的尝试列表不包括重新启动。
-
@HussainTamboli 是的,我看到了,我们认为它与今天的日期有关,所以我将服务器的日期更改为 11 月 30 日,但数字保持不变。一周前也是这个数字,所以我认为它与时间无关。
-
@palindrom 重启是什么意思?重启服务器?可以试一试,但没有解释原因,如果它会解决它。
标签: php session serialization