【问题标题】:detecting user abort with output buffering enabled in PHP在 PHP 中启用输出缓冲检测用户中止
【发布时间】:2011-03-11 13:51:30
【问题描述】:

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

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

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

【问题讨论】:

  • 中止是中止。它中止。中止后你不能做任何事情。
  • 恐怕这听起来像是无法满足的要求。至少您必须ob_get_clean 输出缓冲区并传输一些填充字节(空格)。而且我什至不确定即使在 mod_php 下也能可靠地检测到中止的请求。
  • @tomalak - 实际上,你可以!看一下 register_shutdown_function()... 你可以在这里捕获来识别用户中止、超时、正常完成等...并执行一些额外的代码逻辑
  • @MarkBaker:嗯。你打破了我的讽刺回应。
  • @tomalak - 也许......了解 register_shutdown_function() 也可能有助于 OP 考虑解决他的问题的替代方法

标签: php sockets output-buffering


【解决方案1】:

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

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

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

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

【讨论】:

  • 如果不存在其他解决方案,我将使用类似的方法,但这会触发所有使用ob_start() 注册的回调。
  • 如果你使用助手,你可能总是很邪恶,并且有一个回调中继函数来检查是否正在调用最终刷新。我会尝试更新示例。
  • 这看起来很有趣,我想,我会将它集成到我们的输出缓冲区管理器类中,非常感谢:-)
猜你喜欢
  • 2011-08-02
  • 2012-04-01
  • 2013-02-08
  • 2018-07-02
  • 1970-01-01
  • 1970-01-01
  • 2011-07-27
  • 2011-01-10
  • 2015-01-23
相关资源
最近更新 更多