php - 在 PHP 中启用输出缓冲检测用户中止

标签 php sockets output-buffering

function documentation of ignore_user_abort() 中的备注部分建议 PHP 无法检测到用户有 aborted如果没有数据发送到客户端,则请求。这对于函数 connection_status() 是正确的, 也。不幸的是,我需要在使用输出缓冲的页面上检测到用户中止(可以取消的 ajax 请求)(我无法轻易更改。)

除了使用函数外,还有其他检测用户中止的方法吗 connection_status() ?或使该函数返回正确值的任何特定方法? PHP 实际上应该知道请求已中止,因为从客户端收到了一个 FIN 数据包。

我已经尝试分析 stream metadata php://inputphp://outputphp://stdinphp://stdout 在连接中止之前和之后以阻塞和非阻塞方式读取/写入数据之后,但没有提供任何有用的状态更改。

最佳答案

愚蠢的建议,但是......您是否尝试过向客户端发送一些数据,然后在开始输出缓冲之前发送 flush()?我能想到的唯一其他解决方案是转义缓冲区,但我可以想象它会像您所说的那样非常麻烦。

也许是帮助打破缓冲区的 helper ......

function OBWanCallback($buffer)
{
    if( OBWan::$isFinished )
    {
        // -- Actual callbacks go here ...
    }

   return $buffer;
}

OBWan::startbuffer('OBWanCallback');
[ // -- Example functionality
    self::$callback = $callback;
    ob_start(self::$callback);
]

// -- in some code far, far away ...

OBWan::suspendbuffer();
[ // -- Example functionality
    self::$buffercache = ob_get_clean();
]

echo " ";
flush();

OBWan::resumebuffer();
[ // -- Example functionality
    ob_start(self::$callback);
    echo self::$buffercache;
    self::$buffercache = "";
]

// -- in some code far, far away ...

OBWan::outputbuffer();
[
    self::$isFinished = true;
    return ob_get_clean();
]

如果您实现了深度,则用一些东西来说明您实现的缓冲区的深度。

关于php - 在 PHP 中启用输出缓冲检测用户中止,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5273740/

相关文章:

php - 使用 php 为 imagick 设置密度参数

c - Socket编程c - 文件下载

python发送csv数据到spark streaming

c++ - Boost:如何创建一个线程以便可以控制它的所有标准输出、标准错误?

PHP 挂起问题与 passthru()/system() 调用和输出缓冲

php - 将数据从一个 PHP 文件发布到另一个文件会出错

php - 为什么我的 3 表 JOIN MySQL 查询不起作用?

php - 为什么使用Interval这个sql命令?

c - 如何使用选择处理recv() block

PHP - 如何检测是否启用了输出缓冲