ob_start相关函数学习

在看thinkphp源码的时候

访问的控制器方法没有调用display的时候

在Hook::listen中打印出执行的行为

string 'app_init=>' (length=10)
array
  0 => string 'Behavior\BuildLiteBehavior' (length=26)
string 'app_begin=>' (length=11)
array
  0 => string 'Behavior\ReadHtmlCacheBehavior' (length=30)
string 'app_end=>' (length=9)
array
  0 => string 'Behavior\ShowPageTraceBehavior' (length=30)

但是在使用了display之后

string 'app_init=>' (length=10)
array
  0 => string 'Behavior\BuildLiteBehavior' (length=26)
string 'app_begin=>' (length=11)
array
  0 => string 'Behavior\ReadHtmlCacheBehavior' (length=30)
string 'view_filter=>' (length=13)
array
  0 => string 'Behavior\WriteHtmlCacheBehavior' (length=31)
string 'view_parse=>' (length=12)
array
  0 => string 'Behavior\ParseTemplateBehavior' (length=30)
string 'template_filter=>' (length=17)
array
  0 => string 'Behavior\ContentReplaceBehavior' (length=31)
string 'app_end=>' (length=9)
array
  0 => string 'Behavior\ShowPageTraceBehavior' (length=30)

使用了display多出了三个view_filter,view_parse,template_filter


找来找去,display之后的代码的一部分

// 页面缓存
        ob_start();
        ob_implicit_flush(0);

        if('php' == strtolower(C('TMPL_ENGINE_TYPE'))) { // 使用PHP原生模板

            $_content   =   $content;
            // 模板阵列变量分解成为独立变量
            extract($this->tVar, EXTR_OVERWRITE);
            // 直接载入PHP模板
            empty($_content)?include $templateFile:eval('?>'.$_content);
        }else{
            // 视图解析标签
            $params = array('var'=>$this->tVar,'file'=>$templateFile,'content'=>$content,'prefix'=>$prefix);

            Hook::listen('view_parse',$params);
        }
        // 获取并清空缓存
        $content = ob_get_clean();
        // 内容过滤标签
        Hook::listen('view_filter',$content);
        // 输出模板文件
        return $content;

Hook::listen('view_parse',$params);明明在Hook::listen('view_filter',$content);上面,但是输出顺序确实反的。。。。真不知道怎么回事


看了下ob函数,觉得大概情况知道了,也不知道是不是对的

先贴下ob函数

一、 相关函数简介:
1、Flush:刷新缓冲区的内容,输出。

函数格式:flush()
说明:这个函数经常使用,效率很高。
2、ob_start :打开输出缓冲区
函数格式:void ob_start(void)
说明:当缓冲区激活时,所有来自PHP程序的非文件头信息均不会发送,而是保存在内部缓冲区。
为了输出缓冲区的内容,可以使用ob_end_flush()或flush()输出缓冲区的内容。
3 、ob_get_contents :返回内部缓冲区的内容。
使用方法:string ob_get_contents(void)
说明:这个函数会返回当前缓冲区中的内容,如果输出缓冲区没有激活,则返回 FALSE 。
4、ob_get_length:返回内部缓冲区的长度。
使用方法:int ob_get_length(void)
说明:这个函数会返回当前缓冲区中的长度;和ob_get_contents一样,如果输出缓冲区没有激活。则返回 FALSE。
5、ob_end_flush :发送内部缓冲区的内容到浏览器,并且关闭输出缓冲区。
使用方法:void ob_end_flush(void)
说明:这个函数发送输出缓冲区的内容(如果有的话)。
6、ob_end_clean:删除内部缓冲区的内容,并且关闭内部缓冲区
使用方法:void ob_end_clean(void)
说明:这个函数不会输出内部缓冲区的内容而是把它删除!
7、ob_implicit_flush:打开或关闭绝对刷新
使用方法:void ob_implicit_flush ([int flag])
说明:使用过Perl的人都知道$│=x的意义,这个字符串可以打开/关闭缓冲区,而ob_implicit_flush函数也和那个一样,默认为关闭缓冲区,打开绝对输出后,每个脚本输出都直接发送到浏览器,不再需要调用 flush()。


自己所想的tp的效果

<pre name="code" class="php"><?php
header('Content-type:text/html;charset=utf-8;');
ob_start();
echo "我是缓存区内容";
$contents=ob_get_clean();
echo "我是输出内容<br/>";
echo $contents;
echo "我是测试";//因为在程序执行完毕的时候也是会输出缓存区内容的,这里是想试试ob_get_clean会不会返回缓存区内容
?>

正常情况,应该是现输出“我是缓存区内容”再输出“我是输出内容”

但实际是正好相反

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值