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 相关文章推荐
PHP的中问验证码
Nov 25 PHP
推荐php模板技术[转]
Jan 04 PHP
php 正则表达式小结
Aug 31 PHP
将php数组输出html表格的方法
Feb 24 PHP
教你如何用php实现LOL数据远程获取
Jun 10 PHP
PHP创建PowerPoint2007文档的方法
Dec 10 PHP
PHP操作MySQL的mysql_fetch_* 函数的常见用法教程
Dec 25 PHP
WordPress中用于创建以及获取侧边栏的PHP函数讲解
Dec 29 PHP
PHP如何实现订单的延时处理详解
Dec 30 PHP
PHP实现二叉树深度优先遍历(前序、中序、后序)和广度优先遍历(层次)实例详解
Apr 20 PHP
PHP设计模式之PHP迭代器模式讲解
Mar 22 PHP
Laravel解决nesting level错误和隐藏index.php的问题
Oct 12 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
vs中通过剪切板循环来循环粘贴不同内容
2011/04/30 PHP
PHP 数组和字符串互相转换实现方法
2013/03/26 PHP
PHP实现今天是星期几的几种写法
2013/09/26 PHP
php获取字符串前几位的实例(substr返回字符串的子串用法)
2017/03/08 PHP
Laravel框架查询构造器 CURD操作示例
2019/09/04 PHP
jQuery EasyUI 中文API Button使用实例
2010/04/14 Javascript
JQuery循环滚动图片代码
2011/12/08 Javascript
自定义ExtJS控件之下拉树和下拉表格附源码
2013/10/15 Javascript
html文档中的location对象属性理解及常见的用法
2014/08/13 Javascript
推荐25个超炫的jQuery网格插件
2014/11/28 Javascript
Node.js 学习笔记之简介、安装及配置
2015/03/03 Javascript
JQuery实现动态适时改变字体颜色的方法
2015/03/10 Javascript
深入解析jQuery中Deferred的deferred.promise()方法
2016/05/03 Javascript
js 获取经纬度的实现方法
2016/06/20 Javascript
nodejs开发——express路由与中间件
2017/03/24 NodeJs
JS简单生成随机数(随机密码)的方法
2017/05/11 Javascript
js中变量的连续赋值(实例讲解)
2017/07/08 Javascript
JS对象与JSON互转换、New Function()、 forEach()、DOM事件流等js开发基础小结
2017/08/10 Javascript
Vue项目中设置背景图片方法
2018/02/21 Javascript
JS求Number类型数组中最大元素方法
2018/04/08 Javascript
jquery+ajax实现上传图片并显示上传进度功能【附php后台接收】
2019/06/06 jQuery
判断“命令按钮”是否被鼠标单击详解
2019/07/31 Javascript
在centos7中分布式部署pyspider
2017/05/03 Python
PyQt5 QListWidget选择多项并返回的实例
2019/06/17 Python
PyCharm 创建指定版本的 Django(超详图解教程)
2019/06/18 Python
python交互模式下输入换行/输入多行命令的方法
2019/07/02 Python
Python交互式图形编程的实现
2019/07/25 Python
django框架ModelForm组件用法详解
2019/12/11 Python
信号生成及DFT的python实现方式
2020/02/25 Python
python日志通过不同的等级打印不同的颜色(示例代码)
2021/01/13 Python
SmartBuyGlasses中国:唯视良品(销售名牌太阳镜、墨镜和眼镜框)
2017/07/03 全球购物
创伤外科专业推荐信范文
2013/11/19 职场文书
超市开店计划书
2014/04/26 职场文书
春节晚会开场白
2015/05/29 职场文书
2016年党员读书月活动总结
2016/04/06 职场文书
mysql主从复制的实现步骤
2021/10/24 MySQL