ob_end_flush
(PHP 4, PHP 5, PHP 7, PHP 8)
ob_end_flush — 冲刷(发送)活动输出处理程序的返回值,并关闭活动输出缓冲区
说明
ob_end_flush(): bool
该函数调用输出处理程序(使用 PHP_OUTPUT_HANDLER_FINAL
flag),冲刷(发送)其返回值,丢弃活动输出缓冲区的内容并关闭活动输出缓冲区。
如果没有以 PHP_OUTPUT_HANDLER_REMOVABLE
flag 启动活动输出缓冲区,ob_end_flush() 将失败。
ob_end_flush() 将冲刷(发送)输出处理程序的返回值,即使活动输出缓冲区是在没有
PHP_OUTPUT_HANDLER_FLUSHABLE
flag 的情况下启动的。
参数
此函数没有参数。
错误/异常
如果函数失败将生成 E_NOTICE
异常。
示例
示例 #1 ob_end_flush() 示例
下面的例子给出了一种送出缓冲区内容并关闭所有输出缓冲区的容易的方法:
<?php
while (@ob_end_flush());
?>
参见
- ob_start() - 打开输出控制缓冲
- ob_get_contents() - 返回输出缓冲区的内容
- ob_flush() - 冲刷(发送)活动输出处理程序的返回值
- ob_get_flush() - 冲刷(发送)活动输出处理程序的返回值,返回活动输出缓冲区的内容并将其关闭
- ob_end_clean() - 清空(擦除)活动缓冲区的内容并关闭它
+添加备注
用户贡献的备注 7 notes
jhannus at 128kb dot com ¶
20 years ago
A note on the above example...
with PHP 4 >= 4.2.0, PHP 5 you can use a combination of ob_get_level() and ob_end_flush() to avoid using the @ (error suppresion) which should probably be a little faaster.
<?php
while (ob_get_level() > 0) {
ob_end_flush();
}
?>
nico (at) nokes.de ¶
12 years ago
best way to compress a css code:
<?php
header('Content-type: text/css');
ob_start("compress");
function compress($buffer) {
// remove comments
$buffer = preg_replace('!/\*[^*]*\*+([^/][^*]*\*+)*/!', '', $buffer);
// remove tabs, spaces, newlines, etc.
$buffer = str_replace(array("\r\n", "\r", "\n", "\t", ' ', ' ', ' '), '', $buffer);
return $buffer;
}
include('./template/main.css');
include('./template/classes.css');
<?php
ob_end_flush();
?>
Include in <head>:
<link rel="stylesheet" type="text/css" href="/design.php" media="all" />
anatoliy at miraline dot com ¶
13 years ago
If you enable zlib.output_compression then level count will be increased by 1 and then this code:
<?php while (ob_get_level()) { ob_end_clean(); } ?>
will just freeze your script.
Mark ¶
14 years ago
Wanted to speed things up and put some processing after the page has been delivered to the client. That drove me almost insane, but finally, I found a solution (php 5.2.5):
<?php
ob_start(); // outer buffer
ob_start(); // inner buffer to catch URL rewrites and other post processing
session_start(); // registers URL rewriter with inner buffer!
echo '...';
// log performance data to log files *after* delivering the page!
register_shutdown_function(array($benchmarkclass,'log_perf_data'));
// now flush output output to client
ob_end_flush();
// need to calculate content length *after* URL rewrite!
header("Content-length: ".ob_get_length());
ob_end_flush();
// now we close the session and do some arbitrary clean-up tasks
// registered using register_shutdown_function()
session_write_close();
?>
skippy at zuavra dot net ¶
19 years ago
Apart from being mostly redundant, ob_end_flush() can be downright damaging in some weird cases.
Actual example: a particular page on an Intranet website which would appear blank on Internet Explorer 6 when ob_start('ob_gzhandler') was called in the beginning and ob_end_flush() at the end.
We couldn't figure out what made that page special no matter what we tried. The ob_ functions were placed in scripts which were include()'d by all pages just the same, but only that page did this.
Even stranger, the problem only appeared on direct browser/server connections. Whenever the connection passed through a proxy the problem dissapeared. I'm guessing some kind of HTTP encoding headers mumbo-jumbo.
Solution: unless you really need it in particular cases, remove the ob_end_flush() call and rely on the builtin, automatic buffer flush.
brett at realestate-school dot com ¶
22 years ago
It appears that you can call ob_end_flush() regardless of whether or not output buffering was ever started using ob_start(). This can prove useful because it saves you from having to create conditional statements based on whether a particular function or include file has started output buffering. You can simply call the ob_end_flush() anyway and if there's output in the buffer, it will be sent, otherwise your script will just keep on keepin' on.
备份地址:http://www.lvesu.com/blog/php/function.ob-end-flush.php