PHP如何检测用户是否关闭浏览器
PHP提供了多种机制来处理客户端断开连接的事件,主要包括实时轮询监测连接状态和利用脚本注册关机函数两种方式。
结果与目标
实现 PHP 服务端对用户离开(关闭浏览器、刷新或中断请求)的即时或事后感知,以便执行后续的业务逻辑(如移除在线标识、释放锁等)。
准备条件
ignore_user_abort():允许用户在断开连接后继续执行脚本。connection_status():返回当前的连接状态码(0 为正常,1 为用户中断,2 为超时)。register_shutdown_function():注册一个会在脚本执行完毕或被意外终止时调用的回调函数。
真实操作顺序
第1步:使用连接状态轮询检测(适合实时性要求高的场景)
目的:在后台持续运行的进程中主动检查客户端连接是否还活着。
- 入口:脚本顶层。
- 动作:
- 调用
ignore_user_abort(true)忽略用户的物理断开信号,防止脚本立即终止。 - 启动一个无限循环(如
while(true))。 - 在循环中进行业务处理并输出内容至缓冲区。
- 调用
flush()强制将缓冲数据推送到客户端(注意:必须有输出,否则状态无法更新)。 - 调用
sleep(1)暂停一秒以减少CPU占用。 - 检查
connection_status()返回值。若不为 0,说明连接已非正常断开。
die() 结束脚本。<?php
echo str_repeat(" ", 3000);
ignore_user_abort(true);
mylog('online');
while (true) {
/*
* connection_status 返回值含义:
* 0:程序正常结束
* 1:点击浏览器“停止”按钮
* 2:超时
*/
echo "test<br>\n"; // 必须有输出,否则 ABORTED 状态可能检测不到
flush();
sleep(1);
if (connection_status() != 0) {
mylog('offline');
die('end the script');
}
}
function mylog($str)
{
$fp = fopen('e:/abort.txt', 'a');
$str = date('Y-m-d H:i:s').$str."\r\n";
fwrite($fp, $str);
fclose($fp);
}
?>
第2步:使用 Shutdown Function 检测(适合轻量级异步处理)
目的:当脚本因为任何原因(包括用户关闭浏览器、执行出错等)结束后,自动触发一段代码。
- 入口:脚本开始处。
- 动作:
- 使用
register_shutdown_function()注册一个自定义的回调函数。 - 在普通业务流程中正常运行(例如执行长时间计算的
for循环)。 - 可以使用
set_time_limit()设置最大执行时间以防超时中断。
connection_status())。如果是用户主动关闭(值为1),则执行离线清理工作。<?php
function foo() {
$s = 'connection_status ' . connection_status();
mylog($s);
}
// 注册关闭时的回调函数
register_shutdown_function('foo');
// 设置最大执行时间限制(秒)
set_time_limit(10);
// 模拟耗时任务
for ($i = 0; $i < 10000000; $i++) {
echo $i;
}
function mylog($str)
{
$fp = fopen('e:/abort.txt', 'a');
$str = date('Y-m-d H:i:s').$str."\r\n";
fwrite($fp, $str);
fclose($fp);
}
?>
简要总结
以上关于 PHP 检测用户是否关闭浏览器的详细内容,更多关于 PHP 高级特性及用户行为监控的资料请关注本站其它相关文章!
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









