ob_flush

(PHP 4 >= 4.2.0, PHP 5, PHP 7, PHP 8)

ob_flush刷新(发送)活动输出处理器的返回值

描述

ob_flush(): bool

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

此函数不会像 ob_end_flush()ob_get_flush() 那样关闭活动输出缓冲区。

ob_flush() 在没有使用 PHP_OUTPUT_HANDLER_FLUSHABLE 标志启动的活动输出缓冲区的情况下将失败。

参数

此函数没有参数。

返回值

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

错误/异常

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

参见

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

添加注释

用户贡献的注释 15 个注释

45
Lee
12 年前
截至 2012 年 8 月,所有浏览器似乎都对缓冲采用了一种全有或全无的方法。换句话说,在 php 操作期间,不会显示任何内容。

特别是,这意味着以下列出的解决方法无效

1) ob_flush()、flush() 与其他输出缓冲函数结合使用;

2) 更改 php.ini,将 output_buffer 和/或 zlib.output_compression 设置为 0 或 Off;

3) 设置 Apache 变量,如 "no-gzip",可以通过 apache_setenv() 或 .htaccess 中的条目进行设置。

因此,在浏览器开始再次显示缓冲内容之前,这里列出的提示是毫无意义的。
39
dermeister dot online at gmail dot com
12 年前
ob_flush() 和 flush() 的一些问题可以通过定义内容类型头来解决
header( 'Content-type: text/html; charset=utf-8' );

因此,有效的代码如下所示
<?php
header
( 'Content-type: text/html; charset=utf-8' );
echo
'Begin ...<br />';
for(
$i = 0 ; $i < 10 ; $i++ )
{
echo
$i . '<br />';
flush();
ob_flush();
sleep(1);
}
echo
'End ...<br />';
?>
3
thecichos at gmail dot com
8 个月前
当服务器返回代码 206 并暂时将 output_buffering 设置为较低以使其填满时,输出缓冲区似乎工作得最好

这告诉浏览器等待其他内容
例如
// 将头设置为 206
header("HTTP/1.1 206 Partial Content; Content-Type: text/html; charset=utf-8");

// 刷新当前输出缓冲区
flush();
ob_flush();
ob_end_flush();

// 创建一个新的输出缓冲区
ob_start();

// 保存当前输出缓冲区大小
$tempBuffering = ini_get("output_buffering");

// 设置一个新的、更小的缓冲区大小
ini_set("output_buffering", 256);

// 执行一些缓冲操作
!!! 你所有的精彩代码都应该在这里 !!!

// 如果需要,用一些东西填充缓冲区
echo str_pad(" ", (int)ini_get("output_buffering"), " ");
flush();
ob_flush();

// 还原缓冲区大小
ini_set("output_buffering", $tempBuffering);
11
chris - latko - org
8 年前
尽管浏览器现在拥有全有或全无的缓冲策略,但这些参数并非毫无意义。

如果不使用 ob_flush,就会有超过套接字超时风险(通常在 php-fpm/nginx 组合中看到)。

基本上,刷新解决了臭名昭著的 504 网关超时错误。
2
jake at qzdesign dot co dot uk
5 年前
如果没有活动的输出缓冲区,将生成 E_NOTICE 级别的错误(至少在 PHP 7.1 中)。为了避免这种情况,请先使用 `ob_get_level()` 进行测试。
3
riimeik
13 年前
如果缓冲区仍然无法正常工作,请尝试在启动自己的缓冲区之前清理所有其他缓冲区(即使 PHP 告诉你没有活动的缓冲区)

while(@ob_end_clean());
5
Jens
15 年前
如果你调用 ob_flush() 和 flush() 但仍然无法刷新缓冲区,可能是因为一些杀毒软件(在本例中为 Panda)会保留缓冲区,直到页面加载完毕后才会将其发送到浏览器。
-1
Anonymous
18 年前
我在输出缓冲方面遇到了一些问题,这些问题似乎在服务器上默认启用,尽管 phpinfo 说了一些不同的事情。

无论如何,我需要知道当我运行 ob_start 时,它会从顶层开始,这样我就可以按预期使用 ob_flush,而不必在脚本中调用多个 ob_flush - 这就是我所做的

<?php

// 确保在启动输出缓冲之前关闭输出缓冲
// 这将确保无论 ob 是否已启用,效果都相同
while (ob_get_level()) {
ob_end_flush();
}
// 启动输出缓冲
if (ob_get_length() === false) {
ob_start();
}

?>

然后我可以调用 ob_flush(); 接着调用 flush(); 并获得我想要的输出,而如果我用 ob_start(); 启动脚本,则不会获得。

顺便说一下,这是在带有 php 5.0.4 的 windows apache 2 服务器上。
-5
sebastian at jcompare dot com
15 年前
出于某种原因,仅仅调用 flush 或 ob_flush,甚至同时调用两者,都没有使我的输出缓冲区刷新,而单独调用 ob_end_flush 也不起作用,但将它们全部调用在一起则效果很好。这是我新的输出刷新函数。

<?php
function flush_buffers(){
ob_end_flush();
ob_flush();
flush();
ob_start();
}
?>

享受
-2
colnector at@ colnect punto com
16 年前
如 flush() 手册条目所述,如果 php 使用 zlib 压缩输出,则此函数可能无效。

对于服务器上包含可能需要很长时间才能运行的脚本的文件夹,一个可能的选项是在相关的 .htaccess 文件中添加以下内容

<FilesMatch "\.(php|html?)$">
php_flag zlib.output_compression off
php_value max_execution_time 3000
php_value max_input_time 3000
</FilesMatch>
-7
匿名
19 年前
您必须按正确的顺序调用它们。
ob_flush();
flush();
-4
Reynard Hilman
19 年前
在使用命令行 php 时,如果您的脚本中的某个地方有 ob_start(),则必须先调用 ob_end_flush(),然后才能调用这些函数。
flush();
ob_flush();

如果不先调用 ob_end_flush,则 flush 和 ob_flush 不会有任何效果,至少这是我的经验。
-7
cesoid at gmail dot com
11 年前
目前我在 OS X Snow Leopard 上使用 Chrome 更新页面,因为它发送了更多数据,但只有在我发送 <body> 以及 1013 个字符(总共 1019 个字符)后才会这样做。它收到这些字符后,立即显示它们,然后随着接收到的其他内容一起显示。 (注意,这个浏览器操作系统组合不一定是唯一的,它只是我唯一测试过的组合。)

为了使用 php 做到这一点,我所做的只是在每次 echo 或 print 后发送 ob_flush()。我也可以通过调用 ob_implicit_flush(),然后在 print 之前调用 ob_end_flush() 来实现,然后它会在每次 print 后更新。我拥有非常典型的设置,并且在文件运行时不会更改任何设置,它看起来就像这样

<?php
ob_implicit_flush
();
ob_end_flush();
?><body>[1013 个字符更多]<?php
for ($i = 1; $i < 30000000; ++$i) {}
echo
"没有立即显示的内容";
?>

(好的,“[1013 个字符更多]”部分并非严格意义上的字面意思。)

如果您想要浏览器中的纯文本,请在所有其他内容之前执行此操作

<?php
header
("Content-type: text/plain");
...
?>

然后它不会关心您是否发送了 body 标签,它只会等待 1019 个字符。
-8
jeremy at e2-media dot co dot nz
19 年前
我们在将数据刷新到浏览器时遇到问题。简单调用 ob_flush() 或 flush() 不会起作用。我们发现反复调用这些函数确实起作用了。

<?
flush();
ob_flush();
flush();
ob_flush();
flush();
ob_flush();
?>

真奇怪!
-25
kel at no-spam dot newcastleinfotech dot com dot au
16 年前
还要注意,缓冲区中的任何数据都将在脚本结束时刷新,而不是被销毁,因此通常不需要调用 ob_flush();例如

<?php
ob_start
();
echo
'Hello World!'
?>

仍然会导致 Hello World! 显示在浏览器中。
To Top