WithCoderWithCoderWithCoder

PHP输出控制(ob_系列)函数总结

    本文介绍PHP的输出控制函数.在该系列中,函数开头的ob是output buffering的简称,就是输出缓冲区.当PHP脚本有输出时,输出控制函数可以用来控制输出.这在多种不同情况中非常有用,尤其是用来在脚本开始输出数据后,发送http头信息到浏览器(正常情况下,我们不可以在有数据已经发送后再发送文件头信息到用户浏览器).输出控制函数不影响由 header() 或 setcookie()发送的文件头信息,仅影响像 echo 这样的函数和PHP代码块间的数据.

首先介绍下php在服务器的缓存机制

    1. 在服务器端有程序缓存,这个缓存必须有,程序员不能关闭。

    2. 服务器端可以开启ob缓存,有两个方法:

        2.1 通过ob_start() 开启, 只在当前页面生效 

        2.2 可以在php.ini 的配置文件中启用ob

        // 打开ob缓存
        output_buffering = 4096

    3. 如果你没有打开ob缓存,echo 数据直接放入到程序缓存,如果你打开,就先把echo 数据放入ob缓存。

    4. 当php的脚本执行到最后时,系统把ob数据刷新到程序缓存,然后交给apache,并组成http 响应包,发送给浏览器

输出控制相关主要函数简介

1. Flush: 刷新缓冲区的内容。   
    函数格式: flush( void ) : void
    说明: 这个函数经常使用,效率很高。   
2. ob_start: 打开输出缓冲区   

    函数格式: b_start ([ callback $output_callback [, int $chunk_size [, bool $erase ]]] ) : bool

    说明: 当缓冲区激活时,所有来自PHP程序的非文件头信息均不会发送,而是保存在内部缓冲区.为了输出缓冲区的内容,可以使用ob_end_flush()或flush()输出缓冲区的内容.   

3. ob_get_contents: 返回内部缓冲区的内容   
    使用方法: ob_get_contents ( void ) : string 
    说明: 这个函数会返回当前缓冲区中的内容,如果输出缓冲区没有激活,则返回 FALSE .   
4. ob_get_length: 返回内部缓冲区的长度   
    使用方法: ob_get_length ( void ) : int 
    说明: 这个函数会返回当前缓冲区中的长度,和ob_get_contents一样,如果输出缓冲区没有激活,则返回 FALSE.   
5. ob_end_flush: 发送内部缓冲区的内容到浏览器,并且关闭输出缓冲区   
    使用方法: ob_end_flush ( void ) : bool   
    说明: 这个函数发送输出缓冲区的内容(如果有的话)   
6. ob_end_clean: 删除内部缓冲区的内容,并且关闭内部缓冲区   
    使用方法: ob_end_clean(void) : bool 
    说明: 这个函数不会输出内部缓冲区的内容而是把它删除  
7. ob_implicit_flush: 打开或关闭绝对刷新   
    使用方法: ob_implicit_flush ([int flag = true]) : void  
    说明: 这个函数将打开或关闭绝对(隐式)刷新.绝对(隐式)刷新将导致在每次输出调用后有一次刷新操作,以便不再需要对 flush() 的显式调用

注意事项:

1. 一些Web服务器的output_buffering默认是4069字符或者更大,即输出内容必须达到4069字符服务器才会flush刷新输出缓冲,为了确保flush有效,最好在ob_flush()函数前有以下语句:

    print str_repeat("", 4096);  //以确保到达output_buffering值

2. ob_* 系列函数是操作PHP本身的输出缓冲区,所以ob_flush只刷新PHP自身的缓冲区,而flush是刷新apache的缓冲区。所以,正确使用两者的顺序是:先ob_flush,然后flush。ob_flush是把数据从PHP的缓冲中释放出来,flush是把缓冲内/外的数据全部发送到浏览器。
3. 不要误认为用了ob_start()后,脚本的echo/print等输出就永远不会显示在浏览器上了。因为PHP脚本运行结束后,会自动刷新缓冲区并输出内容。


欢迎分享交流,转载请注明出处:WithCoder » PHP输出控制(ob_系列)函数总结