1.简介
从php脚本echo(print、print_r...)内容之后,是如何显示给用户的呢,下面看看流程:
echo、print => php output_buffering => webServer buffer => browser buff => browser display
即:脚本输出 => php的缓冲区设置 => 系统的缓冲区设置(apache、nginx) => 浏览器的缓冲区设置 => 显示给用户
当PHP脚本有输出时,输出控制函数可以用这些来控制输出。这在多种不同情况中非常有用,尤其是用来在脚本开始输出 数据后,发送http头信息到浏览器。输出控制函数不影响由 header() 或 setcookie()发送的文件头信息,仅影响象 echo这样的函数和PHP代码块间的数据。
2.php.ini配置
输出控制配置选项名字 | 默认 | 可修改范围 | 更新日志 |
---|---|---|---|
output_buffering | "0" | PHP_INI_PERDIR | |
output_handler | NULL | PHP_INI_PERDIR | 自 PHP 4.0.4 起可用 |
implicit_flush | "0" | PHP_INI_ALL | 在 PHP <= 4.2.3 版本中是 PHP_INI_PERDIR |
output_buffering
boolean/integer
该选项设置为 On 时,将在所有的脚本中使用输出控制。如果要限制输出缓冲区的最大值,可将该选项设定为指定的最大字节数(例如 output_buffering=4096)。从PHP 4.3.5 版开始,该选项在 PHP-CLI 下总是为 Off。
output_handler
string
该选项可将脚本所有的输出,重定向到一个函数。例如,将 output_handler 设置为 mb_output_handler() 时,字符的编码将被修改为指定的编码。设置的任何处理函数,将自动的处理输出缓冲。
implicit_flush
boolean
默认为 FALSE
。如将该选项改为 TRUE
,PHP 将使输出层,在每段信息块输出后,自动刷新。这等同于在每次使用 print、echo 等函数或每个 HTML 块之后,调用 PHP 中的 flush() 函数。
不在web环境中使用 PHP 时,打开这个选项对程序执行的性能有严重的影响,通常只推荐在调试时使用。在 CLI SAPI 的执行模式下,该标记默认为 TRUE
。
3.常用相关函数
void flush(void); //冲刷服务器缓冲内容
bool ob_start([callback $fun, int $size, bool $erase]); //新建一个缓冲区
void ob_clean(void); //清空缓冲区内容
void ob_flush(void); //冲刷缓冲区内容
string ob_get_contents(void); //返回缓冲区的内容
bool ob_end_clean(void); //清空缓冲区内容并关闭缓冲区
bool ob_end_flush(void); //冲刷缓冲区内容并关闭缓冲区
4.小例子
4.1,关闭PHP缓冲区,随时输出
ob_end_clean(); //关闭默认缓冲区
echo 'hello ';
flush(); //刷新服务器缓冲
sleep(3);
echo 'world'; //3秒后输出world
flush();
4.2,启用PHP缓冲区,主动刷新缓冲
//每秒输出一句hello world
ob_end_clean(); //关闭默认缓冲区
ob_start(); //打开新的缓冲区
for($i = 0; $i < 10; $i ++){
sleep(1);
echo 'hello world <br />';
ob_flush();
flush();
}
ob_end_clean(); //关闭缓冲区
4.3,保存回显内容到文件
ob_end_clean(); //关闭默认缓冲区
ob_start(); //打开新的缓冲区
print_r($_SERVER); //放入内容到缓冲区
$data = ob_get_contents(); //得到缓冲区内容
ob_end_clean(); //清空并关闭缓冲区
file_put_contents('txt', $data); //写入内容到文件