Chrome 正在创建具有相同 ID 的重复会话


Chrome is creating duplicate sessions with the same id

我今天在修改会话库时遇到了一个问题,这可能是我第一次在后端脚本上看到特定于浏览器的问题。我希望有人能提供一些启示。

会话库的基本工作方式是:实例化时,它会在客户端计算机上检查名为"id"的 cookie(以 uniqid 结果的形式)。如果找到 Cookie,脚本会根据会话表中的条目检查该 Cookie 和用户代理字符串的哈希副本。如果找到匹配的条目,脚本将恢复会话。如果未找到名为"id"的 Cookie,或者会话表中不存在匹配的条目,则脚本将同时创建两者。我认为相当标准。

现在奇怪的部分是:在Firefox中,一切都按照预测工作。用户将获得一个会话,只要 24 小时的非活动状态尚未过去,他将始终在连接时恢复该会话。但是当我在 Chrome 中访问该页面时,即使它看起来相同并且似乎以相同的顺序执行查询,我也会在会话表中看到两个条目。会话共享一个代理字符串,但 id 不同,时间戳日志指示在为用户创建的会话后不久(一秒内)创建幻影会话。

出于调试目的,我一直在执行查询时将查询打印到屏幕上,这是Chrome应该打开一个会话并以某种方式打开两个会话时我看到的示例:

// Attempting to resume a session
SELECT id FROM sessions WHERE id = '4fd24a5cd8df12.62439982' AND agent = '9bcd5c6aac911f8bcd938a9563bc4eca'
// No result, so it creates a new one
INSERT INTO sessions (id, agent, start, last) VALUES ('4fd24ef0347f26.72354606', '9bcd5c6aac911f8bcd938a9563bc4eca', '1339182832', '1339182832')
// Clear old sessions
DELETE FROM sessions WHERE last < 1339096432

这是我之后在数据库中看到的内容:

id, agent, start, last
4fd24ef0347f26.72354606, 9bcd5c6aac911f8bcd938a9563bc4eca, 1339182832, 1339182832
4fd24ef0857f94.72251285, 9bcd5c6aac911f8bcd938a9563bc4eca, 1339182833, 1339182833

我错过了一些明显的东西吗?我唯一能想到的是,Chrome 可能会在后台创建一个隐藏会话,可能是为了抓取页面。如果是这种情况,当我开始将活动会话与 users 表中的条目相关联时,它可能会成为一个问题。我一直在脚本中寻找可能的错误,但到目前为止我还没有找到任何东西,并且在 Firefox 中一切都按预期工作。

我以前遇到过这个问题,同样感到困惑。从几个月前开始,Chrome 就启用了预提取功能。因此,为了加快用户的感知速度,它会抓取页面上的大多数链接,并提前部分检索和呈现它们。非常适合最终用户,因为如果您使用宽带,它确实可以减少页面更改时间。

不幸的是,对于我们Web开发人员来说,它会导致上述混乱。例如,当 Chrome 用户访问网站但尚未分配 Cookie 或会话,但浏览器已预先提取多个页面并分配了多个会话时,就会发生这种情况。

因此,假设有人访问了一个页面,其中包含指向您的 PHP 脚本不同区域的链接,并且该脚本旨在为所有访问者分配一个 cookie......如果Chrome同时或接近其中两个页面,PHP最终将分配不同的会话,因为Chrome中的另一个线程基本上需要一个新的会话/cookie才能完成其他分配。

我知道有两种解决方案:一种是Google的JavaScript API,用于处理预渲染,我发现它不是特别好。另一种方法是在分发来自 PHP 的会话和 cookie 时执行更严格的检查。要么不将会话分配给来宾用户,要么添加一些额外的检查(IP、主机名等)。

希望有帮助。