在 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 onbeforeunloadonunload 函数检测到,但这绝对不准确,因为它不会检测到:

浏览器崩溃 浏览器退出 电脑关机 点击页面链接 返回浏览器时

另见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 中检测浏览器退出的主要内容,如果未能解决你的问题,请参考以下文章

jsp中如何检测浏览器关闭

php,如何检测会话ID是死的还是活的? [复制]

手机浏览器检测到病毒无法下载

[转]浏览器退出之后php还会继续执行么?

php函数检测该网站是不是在手机或计算机浏览器中打开[重复]

在 PHP 中,如何检测执行是从 CLI 模式还是通过浏览器? [复制]