在 PHP 中检测浏览器退出
Posted
技术标签:
【中文标题】在 PHP 中检测浏览器退出【英文标题】:Detecting Browser exit in PHP 【发布时间】:2012-06-06 15:39:29 【问题描述】:我已经查看了一些关于在 php 中检测浏览器退出的主题(此处和谷歌),但我并不清楚如何执行此操作。
我在 PHP 中尝试了register_shutdown_function
,但即使我刷新了浏览器页面,它仍在执行。
谁能帮忙?
提前致谢
【问题讨论】:
我明白了,我尝试使用 JS/jQuery,但似乎存在跨浏览器问题。我想做的是在用户退出或关闭浏览器时更新数据库字段。 【参考方案1】:PHP 是一种服务器端语言。浏览器事件由 DOM 事件处理。在“onunload”或“onbeforeunload”事件中,向 PHP 文件发送 AJAX 调用。
in this other question 对我所说的内容进行了有趣的解释。
【讨论】:
感谢 tpaksu,但“onunload”或“onbeforeunload”存在兼容性问题 是的,我知道。主要思想是使用那些或类似的东西。只是展示了一条路。【参考方案2】:请说明当浏览器关闭时您想要做什么,看看是否有其他方法可以做到这一点。
Web 服务器将其响应发送到浏览器,然后(通常)关闭连接。您必须在 javascript 中执行某些操作,但这并不能满足所有条件。您肯定无法在服务器端检测到它。
可以使用 Javascript onbeforeunload
或 onunload
函数检测到,但这绝对不准确,因为它不会检测到:
另见this answer。
因此,例如,当您想在用户关闭浏览器时注销用户,您最好使用“keepalive”机制而不是“say goodbye”机制。然后,您可以在服务器上注销那些会话未处于活动状态(即未发送“keepalive”)超过 X 分钟的用户(例如使用 cron
)。
【讨论】:
【参考方案3】:我认为没有任何万无一失的方法可以检测 PHP 或 Javascript 中的浏览器关闭按钮。
通过基于计时器的轮询或服务器端的简单会话超时来处理它更安全、更好。
【讨论】:
是的,这就是我发现的! @user1402089: 是的,没错,尤其是如果您尝试更新数据库字段,那么我建议不要依赖任何可用的解决方法,因为它对许多人都不起作用案例。【参考方案4】:一个至少可以避免傻瓜的解决方案是使用 Javascript 和 Ajax 向服务器发送心跳,然后假设当信号停止脉冲时浏览器窗口已关闭。
另一种方法是使用网络套接字来保持持续连接,直到浏览器窗口关闭。
无论如何,设置它需要你做很多工作
【讨论】:
【参考方案5】:不仅仅是 PHP。
PHP 在服务器端运行,并且在用户有机会关闭浏览器时处理您的页面已经完成。您可以从技术上检测 PHP 是否仍在处理页面并且用户使用特定配置关闭它。然而,这并不理想。见connection_aborted()
。
您需要做的是使用 JavaScript 建立一个长轮询连接,并在服务器端对其进行监控。然后,您将了解该窗口何时关闭。该连接可以连接到您的 PHP 脚本,允许 PHP 检查connection_aborted()
。请注意,您需要设置 ignore_user_abort()
才能使其正常工作,或相应地配置 PHP.ini。
【讨论】:
以上是关于在 PHP 中检测浏览器退出的主要内容,如果未能解决你的问题,请参考以下文章