ob_end_flush

(PHP 4, PHP 5, PHP 7, PHP 8)

ob_end_flush刷新(发送)活动输出处理程序的返回值,并关闭活动输出缓冲区

描述

ob_end_flush(): bool

此函数调用输出处理程序(使用 PHP_OUTPUT_HANDLER_FINAL 标志),刷新(发送)它的返回值,丢弃活动输出缓冲区的内容并关闭活动输出缓冲区。

如果没有使用 PHP_OUTPUT_HANDLER_REMOVABLE 标志启动的活动输出缓冲区,则 ob_end_flush() 将失败。

即使活动输出缓冲区是在没有 PHP_OUTPUT_HANDLER_FLUSHABLE 标志的情况下启动的,ob_end_flush() 也会刷新(发送)输出处理程序的返回值。

参数

此函数没有参数。

返回值

成功时返回 true,失败时返回 false

错误/异常

如果函数失败,它将生成一个 E_NOTICE

示例

示例 #1 ob_end_flush() 示例

以下示例展示了一种简单的方法来刷新和结束所有输出缓冲区

<?php
while (@ob_end_flush());
?>

另请参阅

  • ob_start() - 打开输出缓冲
  • ob_get_contents() - 返回输出缓冲区的内容
  • ob_flush() - 刷新(发送)活动输出处理程序的返回值
  • ob_get_flush() - 刷新(发送)活动输出处理程序的返回值,返回活动输出缓冲区的内容并关闭它
  • ob_end_clean() - 清理(擦除)活动输出缓冲区的内容并关闭它

添加注释

用户贡献的注释 10 个注释

13
jhannus at 128kb dot com
20 年前
关于上面示例的说明...

使用 PHP 4 >= 4.2.0、PHP 5,您可以结合使用 ob_get_level() 和 ob_end_flush() 来避免使用 @(错误抑制),这可能稍微快一点。

<?php

while (ob_get_level() > 0) {
ob_end_flush();
}

?>
9
nico (at) nokes.de
11 年前
压缩 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" />
2
anatoliy at miraline dot com
13 年前
如果启用了 zlib.output_compression,则级别计数将增加 1,然后以下代码

<?php while (ob_get_level()) { ob_end_clean(); } ?>

将使您的脚本冻结。
2
brett at realestate-school dot com
21 年前
看来您可以调用 ob_end_flush(),无论是否使用 ob_start() 启动了输出缓冲。这将很有用,因为它可以避免您根据特定函数或包含文件是否启动了输出缓冲来创建条件语句。您可以简单地调用 ob_end_flush(),如果缓冲区中有输出,它将被发送,否则您的脚本将继续运行。
2
Mark
14 年前
想加快速度并在页面传递给客户端后进行一些处理。这让我几乎发疯,但最终,我找到了一个解决方案(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();
?>
1
skippy at zuavra dot net
19 年前
除了大多是多余的,ob_end_flush() 在某些奇怪的情况下可能非常有害。

实际示例:Intranet 网站上的一个特定页面,在开头调用 ob_start('ob_gzhandler') 并在结尾调用 ob_end_flush() 时,在 Internet Explorer 6 上会显示为空白。

无论我们尝试什么,我们都无法弄清楚是什么让那个页面变得特殊。ob_ 函数被放置在所有页面都包含的脚本中,但只有那个页面才这样做。

更奇怪的是,问题只出现在直接浏览器/服务器连接中。每当连接通过代理时,问题就会消失。我猜想是某种 HTTP 编码头的乱七八糟的东西。

解决方案:除非您在特定情况下确实需要它,否则请删除 ob_end_flush() 调用,并依赖于内置的自动缓冲区刷新。
0
Patrick
8 个月前
注意:在 IIS 中,在您将以下内容添加到 web.config 文件中(位于 PHP 处理程序下)之前,刷新输出缓冲区不起作用

responseBufferLimit="0"

我是在发现脚本仅在失败时才会获得 SSE 输出时发现的。
0
shanep
14 年前
看来,如果您正在循环,ob_end_flush() 非常重要。例如,如果您使用的是一个使用输出缓冲区创建 HTML 内容的大型邮件程序。使用 ob_end_flush() 可以避免服务器错误。
0
kriek at jonkriek dot com
21 年前
在大多数情况下不需要 ob_end_flush(),因为当在 php.ini 中打开输出缓冲或调用 ob_start() 时,PHP 本身会在脚本执行结束时自动调用它。
-5
unxed
14 年前
请记住,Chromium 浏览器(以及其他基于 WebKit 的浏览器)在使用 `ob_end_flush` 时可能会遇到一些问题。

https://code.google.com/p/chromium/issues/detail?id=31410

如果不需要 HTML,你可以使用
header("Content-Type: text/plain");
来解决这些问题。
To Top