PHP有输出时,能够用输出控制函数来控制输出php
ob_start(),将内部缓冲区(buffer)打开。当PHP遇到echo,printf等输出语句时, PHP就会将要输出的数据放入缓冲区(buffer)中,等待输出。而只有当缓冲区满了或者php运行完毕,才将数据输出去。输出字节离开PHP缓冲区进去Apache缓冲区或者Nginx缓冲区(fast-cgi),以后进入浏览器缓冲区。以下所示:html
echo,print -> php buffer -> web server buffer(apache缓冲区,fast-cgi缓冲区) -> browser buffergit
下面这些函数的行为受php.ini中的设置影响。github
1.output_bufferingweb
设置为 On 时,打开内部缓冲区(buffer)apache
设置为 Off 时,关闭内部缓冲区(buffer)浏览器
设置为数字时, 限制输出缓冲区的最大值缓存
在php.ini里,output_buffering=4096
是默认开启的。而此时使用ini_set()去改变output_buffering的值, 没法生效。由于输出缓冲区层在php程序启动的时候,就已经打开了。因此只能经过编辑php.ini改变其初始值或者是在执行PHP程序的时候使用-d选项才能改变它们的值。cookie
2.output_handler函数
默认为NULL
是一个回调函数,将脚本的全部输出,用所定义的函数进行处理。相似与ob_start($output_callback)。
$output_callback:
ob_gzhandler : 使用ext/zlib压缩输出
mb_output_handler : 使用ext/mbstring转换字符编码
ob_iconv_handler : 使用ext/iconv转换字符编码
ob_tidyhandler : 使用ext/tidy整理输出的HTML文本
ob_[inflate/deflate]_handler : 使用ext/http压缩输出
ob_etaghandler : 使用ext/http自动生成HTTP的Etag
3.implicit_flush
设置为 On 时,打开绝对刷送。
PHP缓冲区层发送数据到web server buffer,Apache自动刷新输出缓冲区,不须要等待刷新指令,直接就把输出返回到browser buffer
设置为 Off 时,关闭绝对刷送。
不自动刷新apache缓冲区,接受到数据后,等待刷新指令
在php.ini里,implicit_flush=Off
是默认关闭的。若是想要刷新Apache缓冲区,使用PHP的flush()函数手动刷新。或者调用ob_implicit_flush()(隐式刷送)函数。
使用的时候咱们常常一块儿使用
if (ob_get_level() == 0) ob_start(); for ($i = 0; $i<10; $i++){ echo "<br> Line to show."; echo str_pad('',4096)."\n"; ob_flush(); flush(); sleep(2); } echo "Done."; ob_end_flush();
可是ob_*系列的函数是操做php buffer,而flush则是操做web server buffer(活着特指上面所提到的Apache缓冲区)。
1.首先确定是提升性能,减小响应次数
2.修改http头信息
咱们输出消息到页面表示请求和响应已经完成了,是不能再发送http头信息了。可是使用缓冲区就不同了
ob_start(); echo "Hello\n"; setcookie("cookiename", "cookiedata"); ob_end_flush();
在上面的例子中,echo函数的输出将一直被保存在输出缓冲区中直到调用 ob_end_flush() 。同时,对setcookie()的调用也成功存储了一个cookie,而不会引发错误。
3.避免内存限制
对于大文件来讲, 开启PHP缓冲区, 一段一段的读取数据到浏览器,避免用户等待,也避免一次读取数据读取耗尽内存。
4.静态文件缓存
使用缓冲区生成静态html文件
ob_start('ob_gzhandler'); $content = ob_get_contents(); // 打开文件 $file = fopen('./index.html', 'w'); // 将缓冲区中的内容写入文件 fwrite($file, $content); fclose($file); ob_end_clean();
5.处理输出的内容
eg:进行gzip压缩,进行简繁转换,或者进行一些字符串替换
tips:不要在输出缓冲区回调函数内调用任何缓冲区相关的函数,也不要在回调函数中输出任何东西。是由于有些PHP的内部函数也使用了输出缓冲区,它们会叠加到其余的缓冲区上,这些函数会填满本身的缓冲区而后刷新,或者是返回里面的内容。eg:print_r()、highlight_file()和highlight_file::handle()等。在输出缓冲区的回调函数中使用这些函数,会致使未定义的错误。
[ 1 ] : 深刻理解php的输出缓冲区(output buffer)