PHP如何检测用户是否关闭浏览器

Elena
Elena
发布时间:2026-10-13 | 4人浏览过
原创

PHP提供了多种机制来处理客户端断开连接的事件,主要包括实时轮询监测连接状态和利用脚本注册关机函数两种方式。

结果与目标

实现 PHP 服务端对用户离开(关闭浏览器、刷新或中断请求)的即时或事后感知,以便执行后续的业务逻辑(如移除在线标识、释放锁等)。

准备条件

  1. ignore_user_abort():允许用户在断开连接后继续执行脚本。
  2. connection_status():返回当前的连接状态码(0 为正常,1 为用户中断,2 为超时)。
  3. register_shutdown_function():注册一个会在脚本执行完毕或被意外终止时调用的回调函数。

真实操作顺序

第1步:使用连接状态轮询检测(适合实时性要求高的场景)

目的:在后台持续运行的进程中主动检查客户端连接是否还活着。

  • 入口:脚本顶层。
  • 动作:
  1. 调用 ignore_user_abort(true) 忽略用户的物理断开信号,防止脚本立即终止。
  2. 启动一个无限循环(如 while(true))。
  3. 在循环中进行业务处理并输出内容至缓冲区。
  4. 调用 flush() 强制将缓冲数据推送到客户端(注意:必须有输出,否则状态无法更新)。
  5. 调用 sleep(1) 暂停一秒以减少CPU占用。
  6. 检查 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 检测(适合轻量级异步处理)

    目的:当脚本因为任何原因(包括用户关闭浏览器、执行出错等)结束后,自动触发一段代码。

    • 入口:脚本开始处。
    • 动作:
    1. 使用 register_shutdown_function() 注册一个自定义的回调函数。
    2. 在普通业务流程中正常运行(例如执行长时间计算的 for 循环)。
    3. 可以使用 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 高级特性及用户行为监控的资料请关注本站其它相关文章!

    相关标签:

    本站声明

    本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

    Python 相关产品和应用

    全部下载

    专题列表