在PHP中检测浏览器退出

4

我查看了一些关于在php中检测浏览器退出的话题(这里和谷歌),但是我并没有明白如何实现。

我尝试使用PHP中的register_shutdown_function,但是即使我刷新浏览器页面,它也会执行。

有人能帮忙吗?

谢谢!


我明白了,我尝试使用JS/jQuery,但似乎存在跨浏览器问题。我的目标是在用户退出或关闭浏览器时更新数据库字段。 - Woz
5个回答

9

PHP是一种服务器端语言。浏览器事件由DOM事件处理。在“onunload”或“onbeforeunload”事件中,发送一个AJAX调用到一个PHP文件。

而且在这个问题中有一个关于我所说的内容的解释。


1
感谢tpaksu,但是“onunload”或“onbeforeunload”存在兼容性问题。 - Woz
是的,我知道。主要思想是使用那些或类似那些东西。只是展示一种方法。 - Taha Paksu

4
我认为在PHP或Javascript中没有绝对可靠的方法来检测浏览器关闭按钮。更加安全和可靠的方式是基于定时器轮询或服务器端简单的会话超时处理。

是的,那就是我正在寻找的! - Woz
@user1402089:是的,特别是如果你想要更新数据库字段,我建议不要依赖任何可用的解决方法,因为它对于许多情况都不起作用。 - anubhava

4
请说明在浏览器关闭时您想要做什么,以查看是否有其他方法可以实现。Web服务器将其响应发送到浏览器,然后(通常)关闭连接。您必须在Javascript中执行某些操作,但这并不能捕获所有情况。您肯定无法在服务器端检测到它。可以使用Javascript的onbeforeunload或onunload函数来检测它,但这绝对不准确,因为它无法检测到以下情况:浏览器崩溃、浏览器退出、计算机关闭、页面上的链接单击、在浏览器中返回。另请参见this answer。因此,例如,当您希望在用户关闭浏览器时注销用户时,最好使用“保持活动”机制而不是“告别”机制。然后,您可以在服务器上注销那些未活动会话(即未发送“保持活动”)超过X分钟的用户(例如使用cron)。

3

不仅限于PHP。

PHP是运行在服务器端的,当用户关闭浏览器时,它已经完成了处理页面的任务。你可以通过特定的配置来检测PHP是否仍在处理页面并且用户关闭了它,但这并不理想。请参见connection_aborted()

你需要做的是使用JavaScript建立一个长轮询连接,并在服务器端进行监控。然后你就能知道窗口何时关闭。该连接可以连接到你的PHP脚本,让PHP检查connection_aborted()。请注意,你需要设置ignore_user_abort()才能使其工作,或者相应地配置PHP.ini。


3

至少具有防错功能的一种解决方案是使用Javascript和Ajax向服务器发送心跳信号,然后假设当信号停止脉动时浏览器窗口已关闭。

另一种方法是使用Web sockets来保持持续连接,直到浏览器窗口关闭。

无论哪种情况,都需要您投入相当多的工作来设置它。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接