php中ob_start()系列函数的使用

    我在看《php设计模式》的时候看到一个有趣的函数ob_start(),查了一下网友的博客,满心欢喜,我们在平时做模版缓存会选择Smart,实际上我们可以自己来,不借助其他工具,对于我这样对代码控制欲强的人来说简直好东西。输出控制函数可以帮助我们自由的控制php脚本数据的输出,对echo()这类函数起作用,但对header()等函数无效。所以我们利用这一点可以在header()函数之前进行输出,实际上一开始仅仅是输出到缓冲去并没有真正的输出,所以和header()之前输出会报错的说法并不矛盾。下面我们来看例子

    1.简单代码段

    我创建了一个test.php  

<?php
ob_start();//打开缓冲区输出
echo 'Hello';//
header('location:index.php');浏览器被重定向到index.php
ob_end_flush();//输出全部内容到浏览器
    另外一个文件inde.php   
<?php
echo '看看在之前还是之后输出';
    我原本以为会从test.php的内容输出到index.php,但是并不会跨域输出,依然仅仅是输出到当前界面。这里最值得注意的是通常情况下header()之前有输出会报错,但这里并没有,所以我们平常的说法要改一改了header()输出到浏览器页面会报错,这样说才对。

    2.相关函数介绍

     1)FLUSH():刷新缓冲区的内容,输出。

        函数格式:flush()

        说明:这个函数经常使用,效率高。

     2)ob_start():打开缓冲区

        函数格式:void ob_start();

        说明:他的作用就是打开缓冲区,所有非头文件的输出都会到缓冲区,作用就类似于我们使用GD库的时候创建的画布,可以使用ob_get_flush()或flush()输出缓冲区内容。

     3)ob_get_contents()返回缓冲区内的内容

        函数格式:string ob_get_contents()

        说明:如果没有激活缓冲区,将会返回FALSE

     4)ob_get_length():返回内部缓冲区的长度

        函数格式:init ob_get_length()

        说明:缓冲区没有激活将会返回FALSE

     5)ob_end_flush():输出缓冲区内容,关闭缓冲区

        函数格式:void ob_end_flush()

     6)ob_end_clean():删除缓冲区内容并关闭

        函数格式:void ob_end_clean()

        说明:注意这里并不会输出,而是起到类型销毁资源句柄一样的作用

     7)ob_implicit_flush:打开或关闭绝对刷新

        函数格式:void ob_implicit_flush([int flag])

        说明:默认关闭缓冲区,打开绝对输出后,每个脚本都直接发送到浏览器,不再需要使用flush()

     8)ob_clean()清空缓冲区内容,但并不会销毁缓冲区

       写代码的时候提示出来这样一个函数,注意和ob_end_clean()区别,这里补上。

    3.flush()深入

    他的作用是,刷新缓存(cache),这样的输出会在数据量超过256时才会被源源不断的输出。

<?php
for ($i = 0;  $i< 300; $i++) {
    echo $i.'-<br/>';
    sleep(0.9);
<span style="font-family:Courier New;font-size:14px;color:#330000;">}</span>
这里与上面不同的是,会直接输出,并不会到达一定量才往外挤。直接使用ob_implicit_flush()写在最开始,就不再需要使用flush()
<?php
for ($i = 0;  $i< 20; $i++) {
    echo "$i";
   flush();
   sleep(2);
}

    4.ob系列深入

     我在看到别人写的这个例子的时候,有些想法

<?php
ob_start();//打开缓冲区域
phpinfo();//使用phpinfo()函数
$info=ob_get_flush();//将缓冲区内的数据保存到变量中
file_put_contents('test.txt', $info);
ob_end_clean();<span style="font-family:Courier New;">//关闭输出</span>
     原本对于phpinfo()这样的直接输出函数我们是束手无策的,但是利用缓冲区输出可以获得phpinfo()内容,这里要注意的是,浏览器还是会将phpinfo()打印到浏览器上,具体原因我也不清楚,大家找到原因了一定要告诉我。但是
<?php
ob_start();
echo '1234';
ob_end_clean();
这样子使用是不会直接输出到浏览器,我们可以利用这个特性做模版缓存。
    

     我在阅读别人博客的时候也提到了这些:

     一、静态模版技术(高大上的感觉底裤脱下来,感觉就没什么了)

     这个高大上的说法是指:当用户访问一次以后,页面内容没有更新的情况下,我们缓存为静态HTML,当用户再次访问的时候直接读取上一访问的文件,极大的减小系统的压力。看到phpinfo()我想大家都想到了。但这里要说明的是,这个用户在跳转后就需要重新开启一个空间,所以要求我们在跳转之前另外做存储。


    我觉得有价值的内容就这些了,我参考的博客还提到捕捉和加快输出,请点击这里查看:http://www.jcwcn.com/article-16878-1.html

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值