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

来源:互联网 发布:yy挂机软件免费 编辑:程序博客网 时间:2024/05/17 02:53

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

    1.简单代码段

    我创建了一个test.php  

<?phpob_start();//打开缓冲区输出echo 'Hello';//header('location:index.php');浏览器被重定向到index.phpob_end_flush();//输出全部内容到浏览器
    另外一个文件inde.php   
<?phpecho '看看在之前还是之后输出';
    我原本以为会从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时才会被源源不断的输出。

<?phpfor ($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()
<?phpfor ($i = 0;  $i< 20; $i++) {    echo "$i";   flush();   sleep(2);}

    4.ob系列深入

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

<?phpob_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()打印到浏览器上,具体原因我也不清楚,大家找到原因了一定要告诉我。但是
<?phpob_start();echo '1234';ob_end_clean();
这样子使用是不会直接输出到浏览器,我们可以利用这个特性做模版缓存。
    

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

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

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


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

0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 怀孕了有结石怎么办 孕期尿结石疼痛怎么办 怀孕有结石痛怎么办 肾结石痛又怀孕怎么办 怀孕肾结石疼怎么办啊 孕晚期肾绞痛怎么办 肾绞疼引起的呕吐怎么办 肾绞痛肚子胀气怎么办 iga肾炎肉眼血尿怎么办 结石疼怎么办怎么缓解 肾有问题严重怎么办 肾结石突然很疼怎么办 输尿管结石肉眼血尿该怎么办 结石引起肾绞痛怎么办 尿结石支架后尿里老有血怎么办? 结石堵在输尿管怎么办 尿路结石痛怎么办 怀孕了有肾结石怎么办 怀孕有肾结石怎么办啊 肾结石无疼血尿怎么办 胆囊胆管都结石怎么办 肾里面有肿瘤怎么办 肾癌手术后发烧怎么办 尿结石堵住尿道怎么办 尿结石不能排尿怎么办 肾癌小便有血怎么办 膀胱癌膀胱全切怎么办 怀孕了有阑尾炎怎么办 食物堵塞在食管怎么办 食物卡在食管怎么办 小孩食道卡异物怎么办 八十岁老人得了膀胱癌怎么办 肾结石引起吐血尿血怎么办 肾结石引起的尿血怎么办 食道感觉有异物怎么办 膀胱出血有血块怎么办 肾小球滤过率20怎么办 膀胱癌术后有血尿怎么办 肾病贫血怎么办吃什么 低蛋白血症怎么办 慢性肾炎患者感冒了怎么办