3

ignore_user_abort() 函数文档中的注释部分表明,如果没有数据发送到客户端,PHP 无法检测到用户已中止请求。函数connection_status()也是如此。不幸的是,我需要在使用输出缓冲的页面上检测用户中止(可以取消的 ajax 请求)(我不能轻易更改。)

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

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

4

1 回答 1

1

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

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

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();
]

如果您已经实现了深度,则需要说明您已实现的缓冲区的深度。

于 2011-03-11T14:02:02.277 回答