PHP Conference Japan 2024

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() - 清除(擦除)活动输出缓冲区的内容

添加注释

用户贡献注释 10 条注释

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

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

1) ob_flush(), flush() 与其他输出缓冲函数的任何组合;

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

3) 通过 apache_setenv() 或 .htaccess 中的条目设置 Apache 变量,例如“no-gzip”。

因此,在浏览器开始再次显示缓冲内容之前,此处列出的提示是没有意义的。
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 />';
?>
4
thecichos at gmail dot com
1 年前
当服务器返回代码 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
9 年前
尽管浏览器现在具有全有或全无的缓冲策略,但这些论点并非毫无意义。

如果不使用 ob_flush,则存在超过套接字超时风险(在 php-fpm/nginx 组合中很常见)。

基本上,刷新解决了臭名昭著的 504 网关超时错误。
5
Jens
16 年前
如果调用 ob_flush() 和 flush() 仍然无法刷新缓冲区,则可能是因为某些防病毒软件(在这种情况下为 Panda)会在页面加载完毕之前保存缓冲区,然后再将其发送到浏览器。
2
jake at qzdesign dot co dot uk
6 年前
如果没有活动的输出缓冲区,则会生成 E_NOTICE 级别的错误(至少在 PHP 7.1 中是这样)。为避免这种情况,请首先使用 `ob_get_level()` 进行测试。
3
riimeik
14 年前
如果缓冲区仍然无法正常工作,请尝试在启动自己的缓冲区之前清除所有其他缓冲区(即使 PHP 告诉你没有活动的缓冲区)。

while(@ob_end_clean());
-1
Anonymous
19 年前
我在输出缓冲方面遇到问题,这似乎在服务器上默认处于活动状态,尽管 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 服务器上。
-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>
-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();
}
?>

享受
To Top