关于上述示例的说明……
使用 PHP 4 >= 4.2.0、PHP 5,您可以组合使用 ob_get_level() 和 ob_end_flush() 来避免使用 @(错误抑制),这可能稍微快一点。
<?php
while (ob_get_level() > 0) {
ob_end_flush();
}
?>
(PHP 4, PHP 5, PHP 7, PHP 8)
ob_end_flush — 刷新(发送)活动输出处理器的返回值并关闭活动输出缓冲区
此函数调用输出处理程序(使用PHP_OUTPUT_HANDLER_FINAL
标志),刷新(发送)其返回值,丢弃活动输出缓冲区的内容并关闭活动输出缓冲区。
如果没有使用PHP_OUTPUT_HANDLER_REMOVABLE
标志启动的活动输出缓冲区,则ob_end_flush()
将失败。
即使活动输出缓冲区是在没有PHP_OUTPUT_HANDLER_FLUSHABLE
标志的情况下启动的,ob_end_flush()
也会刷新(发送)输出处理程序的返回值。
此函数没有参数。
如果函数失败,它会生成一个E_NOTICE
。
示例 #1 ob_end_flush() 示例
以下示例展示了一种简单的方法来刷新和结束所有输出缓冲区
<?php
while (@ob_end_flush());
?>
关于上述示例的说明……
使用 PHP 4 >= 4.2.0、PHP 5,您可以组合使用 ob_get_level() 和 ob_end_flush() 来避免使用 @(错误抑制),这可能稍微快一点。
<?php
while (ob_get_level() > 0) {
ob_end_flush();
}
?>
压缩 CSS 代码的最佳方法
<?php
header('Content-type: text/css');
ob_start("compress");
function compress($buffer) {
// 删除注释
$buffer = preg_replace('!/\*[^*]*\*+([^/][^*]*\*+)*/!', '', $buffer);
// 删除制表符、空格、换行符等。
$buffer = str_replace(array("\r\n", "\r", "\n", "\t", ' ', ' ', ' '), '', $buffer);
return $buffer;
}
include('./template/main.css');
include('./template/classes.css');
<?php
ob_end_flush();
?>
包含在 <head> 中
<link rel="stylesheet" type="text/css" href="/design.php" media="all" />
如果您启用了 zlib.output_compression,则级别计数将增加 1,然后此代码
<?php while (ob_get_level()) { ob_end_clean(); } ?>
只会冻结您的脚本。
似乎您可以调用 ob_end_flush(),无论是否曾经使用 ob_start() 启动输出缓冲。这可以证明很有用,因为它可以节省您根据特定函数或包含文件是否已启动输出缓冲来创建条件语句的麻烦。您可以简单地始终调用 ob_end_flush(),如果缓冲区中有输出,它将被发送,否则您的脚本将继续运行。
想要加快速度并在页面交付给客户端后进行一些处理。这让我几乎发疯了,但最终我找到了一个解决方案(php 5.2.5)
<?php
ob_start(); // 外部缓冲区
ob_start(); // 内部缓冲区用于捕获 URL 重写和其他后处理
session_start(); // 使用内部缓冲区注册 URL 重写器!
echo '...';
// 将性能数据记录到日志文件,*在*交付页面*之后*!
register_shutdown_function(array($benchmarkclass,'log_perf_data'));
// 现在将输出刷新到客户端
ob_end_flush();
// 需要在 URL 重写*之后*计算内容长度!
header("Content-length: ".ob_get_length());
ob_end_flush();
// 现在我们关闭会话并执行一些任意清理任务
// 使用 register_shutdown_function() 注册
session_write_close();
?>
除了大多是冗余之外,ob_end_flush() 在某些奇怪的情况下可能非常有害。
实际示例:内部网网站上的特定页面,在开头调用 ob_start('ob_gzhandler') 并结尾调用 ob_end_flush() 时,在 Internet Explorer 6 上将显示为空白。
无论我们尝试什么,我们都无法弄清楚是什么使该页面与众不同。ob_ 函数放置在被所有页面同样包含的脚本中,但只有该页面这样做。
更奇怪的是,这个问题只出现在浏览器/服务器的直接连接中。只要连接经过代理服务器,问题就会消失。我猜想这可能是某种 HTTP 编码头部的杂乱问题。
解决方案:除非您在特定情况下确实需要它,否则请移除 `ob_end_flush()` 调用,并依赖内置的自动缓冲区刷新。
注意:在 IIS 中,在 PHP 处理程序的 web.config 文件中添加以下内容后,才能刷新输出缓冲区。
responseBufferLimit="0"
当我只有在脚本失败时才能获得 SSE 输出时,我发现了这一点。
如果您正在循环,`ob_end_flush()` 似乎非常重要。例如,如果您使用的是使用输出缓冲区创建 HTML 内容的大规模邮件发送程序,请使用 `ob_end_flush()` 来避免服务器错误。
在大多数情况下不需要 `ob_end_flush()`,因为当在 php.ini 中打开输出缓冲或通过调用 `ob_start()` 打开输出缓冲时,PHP 本身会在脚本执行结束时自动调用它。
请记住,Chromium 浏览器(以及其他基于 WebKit 的浏览器)在 `ob_end_flush`方面存在一些问题。
http://code.google.com/p/chromium/issues/detail?id=31410
如果您不需要 HTML,可以使用以下代码解决这些问题:
header("Content-Type: text/plain");
来解决这些问题。