关于上面示例的说明...
使用 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() 在某些奇怪的情况下可能非常有害。
实际示例:Intranet 网站上的一个特定页面,在开头调用 ob_start('ob_gzhandler') 并在结尾调用 ob_end_flush() 时,在 Internet Explorer 6 上会显示为空白。
无论我们尝试什么,我们都无法弄清楚是什么让那个页面变得特殊。ob_ 函数被放置在所有页面都包含的脚本中,但只有那个页面才这样做。
更奇怪的是,问题只出现在直接浏览器/服务器连接中。每当连接通过代理时,问题就会消失。我猜想是某种 HTTP 编码头的乱七八糟的东西。
解决方案:除非您在特定情况下确实需要它,否则请删除 ob_end_flush() 调用,并依赖于内置的自动缓冲区刷新。
注意:在 IIS 中,在您将以下内容添加到 web.config 文件中(位于 PHP 处理程序下)之前,刷新输出缓冲区不起作用
responseBufferLimit="0"
我是在发现脚本仅在失败时才会获得 SSE 输出时发现的。
看来,如果您正在循环,ob_end_flush() 非常重要。例如,如果您使用的是一个使用输出缓冲区创建 HTML 内容的大型邮件程序。使用 ob_end_flush() 可以避免服务器错误。
在大多数情况下不需要 ob_end_flush(),因为当在 php.ini 中打开输出缓冲或调用 ob_start() 时,PHP 本身会在脚本执行结束时自动调用它。
请记住,Chromium 浏览器(以及其他基于 WebKit 的浏览器)在使用 `ob_end_flush` 时可能会遇到一些问题。
https://code.google.com/p/chromium/issues/detail?id=31410
如果不需要 HTML,你可以使用
header("Content-Type: text/plain");
来解决这些问题。