function documentation of ignore_user_abort() 中的备注部分建议 PHP 无法检测到用户有 aborted如果没有数据发送到客户端,则请求。这对于函数 connection_status()
是正确的, 也。不幸的是,我需要在使用输出缓冲的页面上检测到用户中止(可以取消的 ajax 请求)(我无法轻易更改。)
除了使用函数外,还有其他检测用户中止的方法吗
connection_status()
?或使该函数返回正确值的任何特定方法? PHP 实际上应该知道请求已中止,因为从客户端收到了一个 FIN
数据包。
我已经尝试分析 stream metadata php://input
、php://output
、php://stdin
和 php://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/