1

好吧,我有一个最奇怪的问题。(警告:前面的文字墙)

我正在跟踪我的变量$_SESSION,该变量设置为不同的数字,具体取决于用户通过 AJAX 单击的选项卡。为方便起见,我还在目标站点上设置了该变量以确保它已设置(对于没有启用 JS 或类似问题的人)。

每个浏览器都可以正常工作。现在我正在使用 IE 进行测试,一旦您在目标站点上单击另一个链接以找到带有 value 的选项卡2,该值就会自行重置为0. 每个其他选项卡(可能的值是0, 12当然,3因为4有五个选项卡)工作正常。

如果我注释掉目标站点中的便利分配(每个目标站点都有那个顺便说一句)选项卡2也会突然起作用。尽管调试这表明目标站点将值设置int(2)int(2)... 所以没有发生真正的变化(但是,删除这个不变的变化可以修复它)。

现在的问题是:
&@#$ Internet Explorer 做了什么来搞砸一个完美的 php 会话?

我已经多次检查了我的整个项目并调试了其中的大部分以找到导致此问题的原因,但一无所获。只有三行设置了值。

  1. 会话对象是第一次创建并获取值0
    我已经检查过了,它真的只在会话创建时被调用。(我已经用回声包围了这条线,如果它被调用,它应该在某处可见,但它从来没有)

  2. AJAX 调用集的接收方法是它从中读取的值$_GET
    这有效并且可以在以下window.location.href="..."重定向到目标站点时继续存在。

  3. 在目标站点上,以确保为未启用 JavaScript 的人设置了该值。
    这似乎是它变得毛茸茸的地方,尽管调试并没有显示出任何错误的行为。

我还检查了是否由于某种原因序列化无法序列化,但是在单击选项卡并更改页面后2检查会话文件/var/lib/php5显示完全健康且设置正确。2

在调试会话初始化时(无论是session_start()在序列化对象完成唤醒例程之后还是之后),我发现该值0位于以下站点请求中(显然是在单击选项卡并被重定向到目标站点之后)。所以我认为php derping反序列化会是一个问题。所以我创建了另一个用于测试的属性,将 a 存储2在其中并让它加载几次,它总是加载为2. 此外,我测试过的任何其他浏览器(即 Firefox 和 Chrome)在选项卡 2 上都没有任何问题......所以 php 做愚蠢的事情也被破坏了。

我想到的另一个想法是 IE 有趣的隐私东西,喜欢忘记像这样的 cookie 和笑话,所以我通过所有页面和 AJAX 请求跟踪会话 ID。
它从未改变。因此,获取具有默认值的新会话对象也0被破坏了。此外,任何其他选项卡都适用于 IE。

最后我检查了做所有 AJAX 事情的 javascript 东西。所有三个选项卡都运行完全相同的代码,因此没有真正的原因导致它失败,2但我还是这样做了。
正如我所预料的那样,那里也没有任何问题。所有呼叫都正常进行,并从服务器获得正确的响应以继续工作。

现在我不知道还有什么需要检查或调试。我什至不明白 IE 是如何在请求之间操作存储在服务器上文件中的服务器端变量的。
我知道这一定与 IE 有关,因为如果这是我的服务器端编程中的一个错误,我也会在其他浏览器中看到效果,对吧?

有没有人知道我还能做些什么来揭穿这个???


当然,这里是我正在使用的所有软件和东西的规格:

Internet Explorer 9.0.8112.16421 在 Windows 7 32 位上作为 VirtualBox 来宾(存在错误)
Internet Explorer 9.0.8112.16421 在 Windows 7 64 位上在真机上(存在错误)
Firefox 16.0.2 在 Fedora 17 x64 上在真机上(错误存在)
Firefox 16.0.1 on Windows 7 64bit on a real machine (bug not present)
Chrome ? (大约 2 周前安装)在真机上的 Windows 7 64 位上(存在错误)
Opera Mobile 12.10.ADR-1211271253 在真机上的 Android 2.3.3 上(存在错误)

服务器是运行内核 2.6.32-5-amd64 的 Debian 6 上带有 PHP 5.3.3-7 的 Apache 2.2.16


2012 年 12 月 3 日更新:

显然它与嵌入在目标页面中的 Flash 视频有关。将它放在其他选项卡之一的目标页面中,我也能够重现其他选项卡的问题。

它似乎也只在加载视频时发生;音频文件不会触发错误。

不过这有点奇怪,因为所涉及的 javascript 代码除了添加一个嵌入之外什么都不做。有问题的播放器是Nonverblaster,它是免费的,到目前为止没有造成任何麻烦。

显然它也利用了http://code.google.com/p/swfobject/

卸载 Flash 播放器后,该错误也消失了,因此它肯定与此视频播放器有关。我还不确定它是如何做到的,因为加载 .swf 和 .flv 文件与 php 会话无关,但它似乎以某种方式做到了。

4

1 回答 1

2

似乎当 IE 向服务器请求 .swf 时,它不会发送会话 cookie。然后,这会导致服务器重新生成 cookie。

一些相关的讨论——

大多数消息来源倾向于同意一个解决方案是让服务器识别与加载 Flash 内容相关的请求,并将其包含在原始会话中。或者至少防止创建新会话。

于 2012-12-03T13:51:16.293 回答