php ob_* 总结

来源:互联网 发布:西安网星软件怎么样 编辑:程序博客网 时间:2024/05/21 01:28

 


 ob_start();
<1>.使用ob_start()函数打开browser的cache,这样可以保证cache的内容在你调用flush(),ob_end_flush()(或程序执行完毕)之前不会被输出。 打开输出缓冲区,当缓冲区激活时,所有来自PHP程序的非文件头信息均不会发送,而是保存在内部缓冲区。

<2>.可以在任何输出内容后面使用header,setcookie以及session,这是PHP ob_start()函数一个很大的特点;也可以使用ob_start的参数,在cache被写入后,然后自动运行命令,比如ob_start(”ob_gzhandler”);而我们最常用的做法是用ob_get_contents()得到cache中的内容,然后再进行处理……

<3>.当处理完毕后,我们可以使用各种方法输出,flush(),ob_end_flush(),以及等到程序执行完毕后的自动输出。当然,如果你用的是ob_get_contents(),那么就要你自己控制输出方式了。

 

 

获取缓冲区信息

ob_get_contents: 返回内部缓冲区的内容。
ob_get_clean: 返回内部缓冲区的内容,并关闭缓冲区。相当于执行 ob_get_contents() and  ob_end_clean()
ob_get_flush:返回内部缓冲区的内容,并关闭缓冲区,再释放内部缓冲区的内容。相当于ob_end_flush()并返回内部缓冲区内容

ob_get_length:返回内部缓冲区的长度,如果缓冲区未被激活,该函数返回FALSE。
ob_get_level:Return the nesting level of the output buffering mechanism
ob_get_status:Get status of output buffers


关闭/删除/刷新缓冲

flush();刷新缓冲区的内容,输出。 这个函数经常使用,效率很高。 将ob_flush释放出来的内容,以及不在PHP缓冲区中的内容,全部输出至浏览器。
ob_flush();释放内部缓冲区的内容,并删除内部缓冲区的内容,但不关闭缓冲区。
ob_clean():删除内部缓冲区的内容,但不关闭缓冲区,也就说该语句之后的输出内容将会继续被添加至缓冲区。

ob_end_clean:删除内部缓冲区的内容,并关闭缓冲区。
ob_end_flush:释放内部缓冲区的内容,并关闭缓冲区。

 

 

其它

ob_gzhandler:ob_start 回调函数,用gzip压缩缓冲区的内容。
ob_implicit_flush:打开或关闭绝对刷新,默认为关闭(但受implicit_flush选项的制约)。所谓绝对刷新,即当有输出语句(e.g. echo)被执行时,便把输出直接发送到浏览器,而不再需要调用 flush()或等到脚本结束时才输出。
ob_list_handlers:List all output handlers in use
output_add_rewrite_var:Add URL rewriter values
output_reset_rewrite_vars — Reset URL rewriter values
这些函数的行为受php_ini设置的影响:

output_buffering:该值为ON时,将在所有脚本中使用输出控制;若该值为一个数字,则代表缓冲区的最大字节限制,当缓存内容达到该上限时将会自动向浏览器输出当前的缓冲区里的内容。
output_handler:该选项可将脚本所有的输出,重定向到一个函数。例如,将 output_handler 设置为 mb_output_handler() 时,字符的编码将被修改为指定的编码。设置的任何处理函数,将自动的处理输出缓冲。
implicit_flush:作用同ob_implicit_flush,默认为Off。
注意事项:

一些Web服务器的output_buffering默认是4069字符或者更大,即输出内容必须达到4069字符服务器才会flush刷新输出缓冲,为 了确保flush有效,最好在ob_flush()函数前有以下语句:
print str_repeat(' ', 4096); //以确保到达output_buffering值。
ob_* 系列函数是操作PHP本身的输出缓冲区,所以,ob_flush只刷新PHP自身的缓冲区。而flush是刷新apache的缓冲区。所以,正确使用俩者的顺序是:先ob_flush,然后flush。ob_flush是把数据从PHP的缓冲中释放出来,flush是把缓冲内/外的数据全部发送到浏览器。不要误认为用了ob_start()后,脚本的echo/print等输出就永远不会显示在浏览器上了。因为PHP脚本运行结束后,会自动刷新缓冲区并输出内容。
要先ob_start()再 flash否则报错 Message: ob_flush() [ref.outcontrol]: failed to flush buffer. No buffer to flush.

原创粉丝点击