我遇到了一个非常奇怪的问题,希望能有一个非常简单的解释,但经过数小时的调试,我无法弄清楚发生了什么。
使用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后面,同样的奇怪数字会被插入。。。无论过程如何。因此,如果我使用以下网址访问选项卡:
/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)验证了$_SESSIONarray是否正常。我通过在代码开头的SESSION_start()之后转储它的数据,验证了下一次刷新时的$_SESSION数据是否发生了更改。
如果我这样做,为了测试,会话数据中不会添加奇怪的数字:
$_SERVER['REQUEST_URI'] = '/customer/2/customer_email/';
如果我导航到另一个url,同样的问题不会发生:
/customer/3/customer_email/
我尝试了更多的东西:C
- 存储会话数组中使用的密钥,但这并不重要
- 在另一台服务器上测试,使用相同的设置,但这种情况也不会发生
- 我尝试在将url放入会话数组后立即写入会话数据,但这也解决不了任何问题
- 将变量$_SERVER['REQUEST_URI']与字符串'/customer/2/customer_email/'进行比较,使用strcmp(),strcasecmp(),在Notepad++中查看为HEX字符,使用stackoverflow或PHP.net上的find函数在PHP中显示为HEX
- 在将url放入$_SESSION['tab_menu']['customer_email']之前,尝试对其进行序列化,但随后数字5322142118就神奇地添加到了序列化的数据中
- 尝试解码数字532142118,但无法将其与任何内容关联起来。两个星期都没有改变
- 已重新启动服务器
- 几乎完全重写了控制"选项卡"的logica,系统仍然挂在该服务器变量上
问题:
- 什么在更改会话数据?如何进一步调试
- 为什么它没有在所有url上发生?几年来,我在几个选项卡上使用了这个系统,这是第一次出现这种奇怪的行为
- 为什么在使用$_SERVER变量时会出现这种情况,而不是在将其作为自类型字符串添加时
- 这个数字是什么意思?532142118
期待一些反应/输入!
编辑:增加了点7&8到"我尝试过的事情"
终于有答案了!
感谢这个答案,它为我指明了正确的方向:
页面之间的PHP会话变量更改
我制作的页面显示了导入的电子邮件,这些页面在会话中出现了问题。一些电子邮件正在加载不存在的图像,html源为:
<img border="0" width="110" height="114" id="_x0000_i1025" src="532142118" />
因此,在后台,这将加载附加有"532142118"的url,完全集成在网络统计中,不会在屏幕上显示任何可见的var_dumps
在设置会话变量时,我又给自己发了一封函数跟踪电子邮件,以得出页面被多次请求的结论。由于图像源的原因,额外请求的页面会使会话和请求的url发生故障
现在我排除了特定的url请求,不将url放在会话变量中,因此错误的img源不会影响系统:)
感谢大家的投入!