PHP输出控制

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/WilliamA/article/details/59553028

配置项

输出缓冲,output_buffering,可以php.ini中设置,一般默认为 output_buffering = 4096 ,即4096Bytes,4KB。还有的会设置为 output_buffering = Off,表示关闭PHP输出缓冲,设置为 output_buffering = On,表示打开无限大的输出缓冲。

下面以一个例子来说明output_buffering的影响:

<?php

    echo "a\n";
    header('Content-Type:text/html;charset=UTF-8');
    echo "b\n";

output_buffering 有以下几种设置:

设置为Off

a 
Warning: Cannot modify header information - headers already sent by (output started at /Applications/MAMP/htdocs/practice/web/test/test.php:7) in /Applications/MAMP/htdocs/practice/web/test/test.php on line 8
b

设置为On

a b

设置为数字

就拿上述例子来说,设置值为4096,如果把 `echo "a\n"` 改为输出一个长度超过4096Bytes的内容就会报错,如果输入内容不超过4096Bytes的内容就没问题。

函数使用(需要开启 display_errors,error_reporting 开启所有错误)

int ob_get_level( void ); // 返回输出缓冲机制的嵌套级别,输出缓冲区不起作用时,返回零

<?php

    echo ob_get_level(); // 输出缓冲机制的嵌套级别(整数),输出零的时候缓冲区不起作用

bool ob_end_clean( void ); // 清空(擦除)缓冲区并关闭输出缓冲
bool ob_end_flush( void ); // 冲刷出(送出)输出缓冲区内容并关闭缓冲

以下把 ob_end_clean() 和 ob_end_flush() 作比较:

<?php

    /**
     * ob_end_clean(),不报错
     */
    if( ob_get_level() != 0 ) {
        ob_end_clean();
    }
    ob_start();
    echo "a\n";
    header('Content-Type:text/html;charset=UTF-8');
    echo "b\n";
<?php

    /**
     * ob_end_clean(),报错
     */
    if( ob_get_level() != 0 ) {
        ob_end_clean();
    }
    ob_start();
    ob_end_clean(); // 删除缓冲区内容,当下一行的 echo "a\n"; 删除后就不会报错
    echo "a\n";
    header('Content-Type:text/html;charset=UTF-8');
    echo "b\n";
<?php

    /**
     * ob_end_flush(),报错
     */
    if( ob_get_level() != 0 ) {
        ob_end_clean();  
    }
    ob_start();
    echo "a\n";
    ob_end_flush();  // 输出缓冲区内容,有内容输出,所以会报错
    header('Content-Type:text/html;charset=UTF-8');
    echo "b\n";

bool ob_start( [ callback outputcallback[,intchunk_size [, bool $erase ]]] );

<?php

    /**
     * 不报错
     */
    if( ob_get_level() != 0 ) {
        ob_end_clean();
    }
    ob_start();
    echo "a\n";
    header('Content-Type:text/html;charset=UTF-8');
    echo "b\n";
<?php

    /**
     * 报错
     */
    if( ob_get_level() != 0 ) {
        ob_end_clean();
    }
    echo "a\n";
    header('Content-Type:text/html:charset=UTF-8');
    echo "b\n";

int ob_get_length( void ); // 返回输出缓冲区内容的长度

<?php

    if( ob_get_level() != 0 ) {
        ob_end_clean();
    }
    ob_start();
    echo "a\n";
    echo ob_get_length();

array ob_get_status( [ bool $full_status = FALSE ] );

<?php

    /**
     * 假如配置开启了output_buffering,返回的数组有两对键值对
     */
    ob_start();
    print_r(ob_get_status(TRUE));
<?php

    if( ob_get_level() != 0 ) {
        ob_end_clean();
    }
    ob_start();
    print_r(ob_get_status(TRUE));

string ob_get_contents( void ); // 返回输出缓冲区的内容

<?php

    if( ob_get_level() != 0 ) {
        ob_end_clean();
    }
    ob_start();
    echo "a\n";
    print_r(array('a', 'b', 'c'));
    $contents = ob_get_contents();
    echo $contents;

string ob_get_clean( void ); // 得到当前缓冲区的内容并删除当前输出缓冲区
string ob_get_flush( void ); // 刷出(送出)缓冲区内容,以字符串形式返回内容,并关闭输出缓冲区

把 ob_get_clean() 和 ob_get_flush() 作比较。
ob_get_clean() 相当于 ob_get_contents() 和 ob_end_clean() 一起的效果

<?php

    /**
     * ob_get_clean(),不报错
     */
    if( ob_get_level() != 0 ) {
        ob_end_clean();
    }
    ob_start();
    print_r(array('a', 'b', 'c'));
    echo "a\n";
    header('Content-Type:text/html;charset=UTF-8');
    echo "b\n";
<?php

    /**
     * ob_get_clean(),报错
     */
    if( ob_get_level() != 0 ) {
        ob_end_clean();
    }
    ob_start();
    print_r(array('a', 'b', 'c'));
    $contents = ob_get_clean();  // 赋值后把缓冲内容删除,所以把下一行的 echo "a\n" 删除后就不会报错
    echo "a\n";
    header('Content-Type:text/html;charset=UTF-8');
    echo "b\n";
    echo $contents;
<?php

    /**
     * ob_get_flush(),并不会把缓冲区删除,所以不会像 ob_get_clean() 那样有 ob_end_clean() 效果,并且注意,对比上面的 ob_get_clean(),可以发现 ob_get_flush() 比其多输出一次$contents
     */
     if( ob_get_level() != 0 ) {
        ob_end_clean();
    }
    ob_start();
    print_r(array('a', 'b', 'c'));
    $contents = ob_get_flush();  // 无法下一行删除与否都会报错,因为该函数把缓冲区内容都输出了
    echo "a\n";
    header('Content-Type:text/html;charset=UTF-8');
    echo "b\n";
    echo $contents;

void ob_flush( void ); // 冲刷出(送出)输出缓冲区中的内容
void ob_clean( void ); // 清空(擦掉)输出缓冲区

以下把 ob_flushob_clean 作比较,可以看出,ob_flush() 只是把缓冲区的内容移出缓冲区,而ob_clean() 直接把内容删除了

<?php

    /**
     * ob_flush()
     */
    if( ob_get_level() != 0 ) {
        ob_end_clean();
    }
    ob_start();
    echo "a\n";
    ob_flush();
    echo "b\n";
<?php

    /**
     * ob_clean()
     */
    if( ob_get_level() != 0 ) {
        ob_end_clean();
    }
    ob_start();
    echo "a\n";
    ob_clean();
    echo "b\n";
展开阅读全文

没有更多推荐了,返回首页