【发布时间】:2011-09-21 08:52:16
【问题描述】:
我在工作中运行的 PHP 站点出现问题,用户在几分钟后就会退出(具体时间会有所不同,但它的频率足以成为一个问题),无论他们是否积极参与是否使用该网站。
困难在于我无法重现这个问题,如果我以相同的用户使用相同的浏览器登录,我不会被注销,这表明这不是网站被完全破坏的情况。不幸的是,我无权访问用户机器来运行任何流量嗅探软件。
我已经检查的事情是:
- 要求用户尝试不同的浏览器。这似乎无法解决问题,也不是长期解决方案,因为我无法指定客户将使用哪些浏览器。
- 服务器时间正确,与用户机器一致。
- 运行 Apache 的用户具有写入会话文件夹的权限,我可以看到正在创建的会话文件及其修改时间正在更新。
- 没有使用输出缓冲函数。
- 问题出现在各种似乎没有任何共同点的页面上(也就是说,并不是它们都使用 AJAX,或者更新数据库或其他原因)。
- 用户只能从一台机器访问他们的帐户,即他们没有在笔记本电脑上做任何工作,切换到桌面然后想知道为什么他们在笔记本电脑上被注销(我们不允许多个同一用户同时登录)。
PHP 中的会话设置是 Debian 的默认设置,在 .htaccess 文件或其他任何地方都没有更改。主要有:
session.cookie_lifetime 0
session.gc_divisor 100
session.gc_maxlifetime 1440
session.gc_probability 0
session.save_handler files
session.save_path /var/lib/php5
session.use_cookies On
Debian 通过 cron 作业删除会话,而不是使用 PHP 的垃圾收集器,这就是 gc_probability 设置为 0 的原因。我们正在运行的 PHP 版本是:PHP 5.2.6-1+lenny13 with Suhosin-Patch 0.9.6.2 (cli)(Lenny 的最新版本,我们很快就会升级到 Squeeze,但我认为这不是问题的原因)。
我们使用 Zend_Session 来管理会话,并且 Zend_Session_Namespace 的实例在每个页面上创建一次,因此会自动调用 session_start()。通过在注销页面上调用 Zend_Session::destroy() 来清除会话,因此用户应该注销的唯一方法是:
- 如果他们明确点击注销链接(我们会在发生这种情况时进行记录,并且浏览似乎不是预先获取页面并因此将用户注销)。
- 如果他们让会话处于非活动状态超过 24 分钟,此时 Debian 可能会删除他们的会话(有一个每半小时运行一次的 cron 作业删除所有超过 24 分钟未修改的会话)。
- 如果他们关闭浏览器,他们的会话 cookie 的过期时间为 0 将被删除。
查看用户是否登录的检查是:
- 他们有一个有效的会话(通过查看我们是否可以访问 $zsession->user_id 来检查)。
- 会话表中有一行具有匹配的用户 ID 和会话 ID,并且最近一次更新是不到一小时前。我们在注销时删除这一行,这样即使会话仍然存在于磁盘上,任何人都无法在不登录的情况下访问该帐户。
谁能建议我可以尝试的其他方法?
编辑:我根据 cmets 尝试了一些额外的东西:
- 设置 session.cookie_domain:这在 PHP 中似乎有非常奇怪的行为。如果我不设置此变量并将其保留为默认值 ''(空字符串),则对 www.domain.com 的请求将生成 www.domain.com 的 cookie。但是,如果我将 cookie_domain 设置为“www.domain.com”,则 cookie 的域为“.www.domain.com”(注意前导点,这意味着对 www.domain.com 下的所有内容都有效,例如 subsite.www .domain.com)。
- 设置 session.cookie_lifetime:PHP 似乎不会更新每个请求的过期时间,所以如果我将 cookie_lifetime 设置为 3600,cookie 将在用户首次访问该站点一小时后过期,即使他们登录并不断使用它.
编辑 2:根据人们提出的其他问题:
- 该站点托管在数据中心的单独 VLAN 上。访问该网站的人与该网站不在同一网络上。
- 没有使用 IP 身份验证,也没有在会话过程的任何部分使用客户端的 IP 地址(例如,如果用户的下一个请求来自不同的 IP)。
【问题讨论】:
-
上次我遇到了类似的问题,我错过了在某个 php 文件中正确处理会话(所有其他文件都可以)。结果是,在用户尝试离开该特定页面后会话变得无效,因此他在不同的分钟后注销,具体取决于他导航到该页面的时间。不要将此视为解决方案。将其视为一个提示,您可以在其中查找一些错误。祝你好运! ^^
-
时区(或错误的服务器时间)在某些情况下可能会导致问题。
-
@Smar 可以,但我确实明确表示“服务器时间正确且与用户机器一致”。