PHP中对缓冲区的控制实现代码


Posted in PHP onSeptember 29, 2013

大家在使用PHP的过程中不免要使用到header和setcookie两个函数,这两个函数会发送一段文件头信息给浏览器,但是如果在使用这两个函数之前已经有了任何输出(包括空输出,比如空格,回车和换行)就会提示出错,提示信息如下:“Header had all ready send by”!那有什么方法可以在有了输出的情况下面在发送文件头信息呢?在PHP 4.0里面加入了缓冲区控制的几个函数,使用这些函数可以帮我们解决很多问题。

一、 相关函数简介:

1、Flush:输出缓冲区内的内容并且删除缓冲区。

函数格式:flush()

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

2、ob_start :打开输出缓冲区

函数格式:void ob_start(void)

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

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函数也和那个一样,默认为关闭缓冲区,打开绝对输出。

二、使用例子:

在一开始,笔者说了用缓冲区控制的函数可以防止文件头发送信息出错,下面就是一个例子:

<? //PHP提示符
ob_start(); //打开缓冲区
echo "Hello/n"; //输出
header('location:gotourl.php'); //把浏览器重定向到gotourl.php
?>

如果去掉ob_start,PHP就会提示在文件的第4行出错(出错信息如前面所示),但是加上ob_start,就不会提示出错,原因是当打开了缓冲区,echo后面的字符不会输出到浏览器,而是保留在服务器,直到你使用flush或者ob_end_flush才会输出,所以并不会有任何文件头输出的错误!

下面再给出一个很经典的用途:

比如你用<?phpinfo();?>得到服务器和客户端的设置信息,但是这个信息会因为客户端的不同而不同,如果想要保存phpinfo()函数的输出怎么办呢?在没有缓冲区控制之前,可以说一点办法也没有,但是有了缓冲区的控制,我们可以轻松的解决:

<?
ob_start(); //打开缓冲区
phpinfo(); //使用phpinfo函数
?$info=ob_get_contents(); //得到缓冲区的内容并且赋值给?$info
?$file=fopen('info.txt','w'); //打开文件info.txt
fwrite(?$file,?$info); //写入信息到info.txt
fclose(?$file); //关闭文件info.txt
?>

用以上的方法,就可以把不同用户的phpinfo信息保存下来,这在以前恐怕没有办法办到!其实上面就是将一些“过程”转化为“函数”的方法!

PHP 相关文章推荐
DedeCms模板安装/制作概述
Mar 11 PHP
推荐Discuz!5的PHP代码高亮显示与实现可运行代码
Mar 15 PHP
PHP中simplexml_load_string函数使用说明
Jan 01 PHP
php array_intersect比array_diff快(附详细的使用说明)
Jul 03 PHP
基于Discuz security.inc.php代码的深入分析
Jun 03 PHP
php实现的简单日志写入函数
Mar 31 PHP
php通过前序遍历树实现无需递归的无限极分类
Jul 10 PHP
PHP读取配置文件类实例(可读取ini,yaml,xml等)
Jul 28 PHP
PHP的Yii框架入门使用教程
Feb 15 PHP
PHP实现微信商户支付企业付款到零钱功能
Sep 30 PHP
解决laravel资源加载路径设置的问题
Oct 14 PHP
php7 图形用户界面GUI 开发示例
Feb 22 PHP
PHP验证码函数代码(简单实用)
Sep 29 #PHP
PHP在引号前面添加反斜杠(PHP去除反斜杠)
Sep 28 #PHP
php 获取今日、昨日、上周、本月的起始时间戳和结束时间戳的方法
Sep 28 #PHP
PHP无限分类(树形类)
Sep 28 #PHP
PHP的PSR规范中文版
Sep 28 #PHP
PHP中time(),date(),mktime()区别介绍
Sep 28 #PHP
php中time()和mktime()方法的区别
Sep 28 #PHP
You might like
Windows下的PHP5.0详解
2006/11/18 PHP
thinkphp模板赋值与替换实例简述
2014/11/24 PHP
javascript算法题 求任意一个1-9位不重复的N位数在该组合中的大小排列序号
2012/07/21 Javascript
JavaScript 更严格的相等 [译]
2012/09/20 Javascript
JavaScript获取URL汇总
2015/06/08 Javascript
JS实现网站菜单拖拽移位效果的方法
2015/09/24 Javascript
javascript仿百度输入框提示自动下拉补全
2016/01/07 Javascript
IE8 内存泄露(内存一直增长 )的原因及解决办法
2016/04/06 Javascript
BootStrap框架个人总结(bootstrap框架、导航条、下拉菜单、轮播广告carousel、栅格系统布局、标签页tabs、模态框、菜单定位)
2016/12/01 Javascript
AngularJS框架的ng-app指令与自动加载实现方法分析
2017/01/04 Javascript
node.js发送邮件email的方法详解
2017/01/06 Javascript
分享19个JavaScript 有用的简写写法
2017/07/07 Javascript
详解 vue better-scroll滚动插件排坑
2018/02/08 Javascript
vue v-model实现自定义样式多选与单选功能
2018/07/05 Javascript
vue实现直播间点赞飘心效果的示例代码
2019/09/20 Javascript
在node环境下parse Smarty模板的使用示例代码
2019/11/15 Javascript
[02:03]永远的信仰DOTA2 中国军团历届国际邀请赛回顾
2016/06/26 DOTA
python获取从命令行输入数字的方法
2015/04/29 Python
对python numpy.array插入一行或一列的方法详解
2019/01/29 Python
python函数参数(必须参数、可变参数、关键字参数)
2019/08/16 Python
tensorflow 利用expand_dims和squeeze扩展和压缩tensor维度方式
2020/02/07 Python
python中with用法讲解
2020/02/07 Python
Python 基于FIR实现Hilbert滤波器求信号包络详解
2020/02/26 Python
pyinstaller打包成无控制台程序时运行出错(与popen冲突的解决方法)
2020/04/15 Python
Python迭代器协议及for循环工作机制详解
2020/07/14 Python
Django:使用filter的pk进行多值查询操作
2020/07/15 Python
巴西体育用品商店:Lojão dos Esportes
2018/07/21 全球购物
检察官就职演讲稿
2014/01/13 职场文书
护理专科自荐书范文
2014/02/18 职场文书
食品科学与工程专业毕业生求职信范文
2014/07/21 职场文书
七一建党日演讲稿
2014/09/05 职场文书
离婚协议书怎么写2014
2014/09/30 职场文书
2014年实习期工作总结
2014/11/27 职场文书
合作协议书格式范本
2016/03/21 职场文书
2016年学校十一国庆节活动总结
2016/04/01 职场文书
详解SQL的窗口函数
2022/04/21 Oracle