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

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

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 相关产品和应用

    全部下载
    Selenium

    Selenium

    4.51.0 · Windows

    用于浏览器自动化和 Web 测试的 Python 工具。

    scikit-learn

    scikit-learn

    1.9.1 · Windows

    常用 Python 机器学习算法与模型评估工具库。

    Black

    Black

    26.10.1 · Windows

    强调一致性的 Python 自动代码格式化工具。

    Ruff

    Ruff

    0.17.1 · macOS

    由 Rust 编写的高速 Python 代码检查和格式化工具。

    pytest

    pytest

    9.1.1 · Windows

    简洁而强大的 Python 自动化测试框架。

    FastAPI

    FastAPI

    0.146.0 · Windows

    高性能 Python API 框架,支持类型提示和自动接口文档。

    Flask

    Flask

    3.1.3 · Windows

    轻量灵活的 Python Web 应用框架。

    Django

    Django

    6.1.2 · Windows

    成熟的 Python Web 框架,适合构建内容站点和业务系统。

    Spyder

    Spyder

    6.1.7 · Windows

    面向科学计算与数据分析的 Python 集成开发环境。

    SciPy

    SciPy

    1.18.1 · Windows

    面向科学、工程和技术计算的 Python 算法库。