我今天在修改会话库时遇到了一个问题,这可能是我第一次在后端脚本上看到特定于浏览器的问题。我希望有人能解释一下。
会话库的基本工作方式是:实例化时,它会在客户端机器上检查名为“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 可能会在后台创建一个隐藏会话,可能是为了抓取页面。但是,如果是这种情况,那么当我开始将活动会话与用户表中的条目相关联时,它可能会成为一个问题。我一直在寻找我的脚本中可能存在的错误,但到目前为止我还没有发现任何东西,并且在 Firefox 中一切正常。