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 相关文章推荐
PHP4之真OO
Oct 09 PHP
简单的页面缓冲技术
Oct 09 PHP
《PHP边学边教》(01.开篇――准备工作)
Dec 13 PHP
用PHP的ob_start() 控制您的浏览器cache
Aug 03 PHP
PHP的5个安全措施小结
Jul 17 PHP
php 判断数组是几维数组
Mar 20 PHP
PHP文件上传判断file是否己选择上传文件的方法
Nov 10 PHP
PHP实现多文件上传的方法
Jul 08 PHP
详解Laravel视图间共享数据与视图Composer
Aug 04 PHP
实现PHP搜索加分页
Oct 12 PHP
thinkPHP js文件中U方法不被解析问题的解决方法
Dec 05 PHP
phpcms的分类名称和类别名称的调用
Jan 05 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
php数据库连接
2006/10/09 PHP
php中强制下载文件的代码(解决了IE下中文文件名乱码问题)
2011/05/09 PHP
PHP利用正则表达式将相对路径转成绝对路径的方法示例
2017/02/28 PHP
JScript中的undefined和&quot;undefined&quot;的区别
2007/03/08 Javascript
$.getJSON在IE下失效的原因分析及解决方法
2013/06/16 Javascript
jquery中的ajax方法怎样通过JSONP进行远程调用
2014/05/04 Javascript
非常实用的12个jquery代码片段
2015/11/02 Javascript
javascript冒泡排序小结
2016/04/10 Javascript
JS提示:Uncaught SyntaxError:Unexpected token ) 错误的解决方法
2016/08/19 Javascript
AnjularJS中$scope和$rootScope的区别小结
2016/09/18 Javascript
js 点击a标签 获取a的自定义属性方法
2016/11/21 Javascript
jQuery EasyUI Panel面板组件使用详解
2017/02/28 Javascript
vue2.0父子组件间通信的实现方法
2017/04/19 Javascript
父组件中vuex方法更新state子组件不能及时更新并渲染的完美解决方法
2018/04/25 Javascript
webstrom Debug 调试vue项目的方法步骤
2018/07/17 Javascript
爬虫利器Puppeteer实战
2019/01/09 Javascript
jQuery 动态粒子效果示例代码
2020/07/07 jQuery
Python 文件和输入输出小结
2013/10/09 Python
python使用post提交数据到远程url的方法
2015/04/29 Python
python读取图片的方式,以及将图片以三维数组的形式输出方法
2019/07/03 Python
Python Django 实现简单注册功能过程详解
2019/07/29 Python
pygame库实现俄罗斯方块小游戏
2019/10/29 Python
Python环境配置实现pip加速过程解析
2020/11/27 Python
让IE6支持css3,让 IE7、IE8 都支持CSS3
2011/10/09 HTML / CSS
HTML5新增的8类INPUT输入类型介绍
2015/07/06 HTML / CSS
June Jacobs尊积帕官网:知名的spa水疗护肤品牌
2019/03/21 全球购物
描述一下JVM加载class文件的原理机制
2013/12/08 面试题
敏捷开发的主要原则都有哪些
2015/04/26 面试题
暑假实习求职信范文
2013/09/22 职场文书
心得体会开头
2014/01/01 职场文书
财务会计专业个人求职信范本
2014/01/08 职场文书
《浅水洼里的小鱼》听课反思
2014/02/28 职场文书
党风廉设责任书
2014/04/16 职场文书
践行三严三实心得体会
2014/10/13 职场文书
国际贸易实训报告
2014/11/05 职场文书
php7中停止php-fpm服务的方法详解
2021/05/09 PHP