ob 函数讲解
ob的基本原则:如果ob缓存打开,则echo的数据首先放在ob缓存。如果是header信息,直接放在程序缓存。当页面履行到最后,会把ob缓存的数据放到程序缓存,然后依次返回给涉猎器。
下面我说说ob的基本作用:
1)防止在涉猎器有输出之后再应用setcookie()、header()或session_start()等发送头文件的函数造成的差错。其实这样的用法少用为好,养成良好的代码习性。
2)捕捉对一些不可获取的函数的输出,比如phpinfo()会输出一大堆的HTML,但是我们无法用一个变量例如$info=phpinfo();来捕捉,这时候ob就管用了。
3)对输出的内容进行处理,例如进行gzip收缩,例如进行简繁转换,例如进行一些字符串调换。
4)生成静态文件,其实就是捕捉整页的输出,然后存成文件。经常在生成HTML,或者整页缓存中应用。
对于刚才说的第三点中的GZIP收缩,可能是很多人想用,却没有真用上的,其实稍稍改动下代码,就可以实现页面的gzip收缩。
. 代码如下:
ob_start(ob_gzhandler);
要缓存的内容
没错,加一个ob_gzhandler这个回调函数就可以了,不过这么做有些小问题,一是需要zlib支持,二是没有判断涉猎器是否支持gzip(现在好像都支持,iphone涉猎器好像都支持了)。
以前的做法是判断一下涉猎器是否支持gzip,然后用第三方的gzip函数来收缩ob_get_contents() 的内容,最后echo。
一、ob系列函数中常用函数集锦
. 代码如下:
ob_start(); //打开一个输出缓冲区,所有的输出信息不再直接发送到涉猎器,而是保存在输出缓冲区里面。
ob_clean(); //删除内部缓冲区的内容,不关闭缓冲区(不输出)。
ob_end_clean(); //删除内部缓冲区的内容,关闭缓冲区(不输出)。
ob_get_clean(); //返回内部缓冲区的内容,关闭缓冲区。相当于履行 ob_get_contents() and ob_end_clean()
ob_flush(); //发送内部缓冲区的内容到涉猎器,删除缓冲区的内容,不关闭缓冲区。
ob_end_flush(); //发送内部缓冲区的内容到涉猎器,删除缓冲区的内容,关闭缓冲区。
ob_get_flush(); //返回内部缓冲区的内容,并关闭缓冲区,再释放缓冲区的内容。相当于ob_end_flush()并返回缓冲区内容。
flush(); //将ob_flush释放出来的内容,以及不在PHP缓冲区中的内容,整个输出至涉猎器;刷新内部缓冲区的内容,并输出。
ob_get_contents(); //返回缓冲区的内容,不输出。
ob_get_length(); //返回内部缓冲区的长度,如果缓冲区未被激活,该函数返回FALSE。
ob_get_level(); //Return the nesting level of the output buffering mechanism.
ob_get_status(); //Get status of output buffers.
ob_implicit_flush(); //打开或关闭绝对刷新,默觉得关闭,打开后ob_implicit_flush(true),所谓绝对刷新,即当有输出语句(e.g: echo)被履行时,便把输出直接发送到涉猎器,而不再需要调用flush()或等到脚本收场时才输出。
ob_gzhandler //ob_start回调函数,用gzip收缩缓冲区的内容。
ob_list_handlers //List all output handlers in use
output_add_rewrite_var //Add URL rewriter values
output_reset_rewrite_vars //Reset URL rewriter values
这些函数的行为受php_ini设置的影响:
output_buffering //该值为ON时,将在所有脚本中应用输出把持;若该值为一个数字,则代表缓冲区的最大字节限制,当缓存内容达到该上限时将会自动向涉猎器输出当前的缓冲区里的内容。
output_handler //该选项可将脚本所有的输出,重定向到一个函数。例如,将 output_handler 设置为 mb_output_handler() 时,字符的编码将被改动为指定的编码。设置的任何处理函数,将自动的处理输出缓冲。
implicit_flush //作用同ob_implicit_flush,默觉得Off。
二、实例解说
1、使 header() 函数前可以有echo代码
Output Control 函数可以让你自由把持脚本中数据的输出。它非常地有用,特别是对于:当你想在数据已经输出后,再输出文件头的情况。
输出把持函数不对应用 header() 或 setcookie(),发送的文件头信息产生影响,只对那些类似于 echo() 和 PHP 代码的数据块有作用。
. 代码如下:
ob_start(); //打开缓冲区
echo "Hello\n"; //输出
header(“location:index.php”); //把涉猎器重定向到index.php
ob_end_flush(); //输出整个内容到涉猎器
所有对header()函数有领会的人都知道,这个函数会发送一段文件头给涉猎器,但是如果在应用这个函数之前已经有了任何输出(包括空输出,比如空格,回车和换行)就会提示出错。如果我们去掉第一行的ob_start(),再履行此程序,我们会发现得到了一条差错提示:"Header had all ready send by"!但是加上ob_start,就不会提示出错,原因是当打开了缓冲区,echo后面的字符不会输出到涉猎器,而是保留在服务器,直到你应用flush或者ob_end_flush才会输出,所以并不会有任何文件头输出的差错!
2、保存 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
3、静态模版技巧
所谓静态模版技巧就是通过某种方式,使得用户在client端得到的是由PHP产生的html页面。如果这个html页面不会再被更新,那么当另外的用户再次涉猎此页面时,程序将不会再调用PHP以及相关的数据库,对于某些信息量对比大的网站,例如sina、163、sohu。类似这种的技巧带来的好处是非常巨大的。
. 代码如下:
ob_start(); //打开缓冲区
php页面的整个输出
$content = ob_get_contents(); //取得php页面输出的整个内容
$fp = fopen("output00001.html", "w"); //创建一个文件,并打开,准备写入
fwrite($fp, $content); //把php页面的内容整个写入output00001.html,然后……
fclose($fp);
三、输出缓存句柄ob_gzhandler
PHP4.0.4有一个新的输出缓存句柄ob_gzhandler,它与前面的类相似,但用法不同。应用ob_gzhandler时要在php.ini中加入的内容如下:
. 代码如下:
output_handler = ob_gzhandler;
这行代码使得PHP激活输出缓存,并收缩它发送出去的所有内容。
如果由于某种原因你不想在php.ini中加上这行代码,你还可以通过PHP源文件所在目录的.htaccess文件改变默认的服务器行为(不收缩),语法如下:
. 代码如下:
php_value output_handler ob_gzhandler
或者是从PHP代码调用,,如下所示:
. 代码如下:
ob_start("ob_gzhandler");
采纳输出缓存句柄的法子确凿非常有效,而且不会给服务器带来什么特殊的负荷。但必须注意的是,Netscape Communicator对收缩图形的支持不佳,因此除非你能够保证所有用户都应用IE涉猎器,否则你应该阻挠收缩JPEG和GIF图形。一般地,对于所有其他文件,这种收缩都有效,但建议你针对各种涉猎器都分辨进行测试,特别是当你应用了特殊的插件或者数据查看器时这一点尤其首要。
注意事项:
1、一些Web服务器的output_buffering默认是4069字符或者更大,即输出内容必须达到4069字符服务器才会flush刷新输出缓冲,为了确保flush有效,最好在ob_flush()函数前有以下语句:
. 代码如下:
print str_repeat("", 4096); //以确保到达output_buffering值
2、ob_* 系列函数是操作PHP本身的输出缓冲区,所以ob_flush只刷新PHP自身的缓冲区,而flush是刷新apache的缓冲区。所以,正确应用俩者的顺序是:先ob_flush,然后flush。ob_flush是把数据从PHP的缓冲中释放出来,flush是把缓冲内/外的数据整个发送到涉猎器。
3、不要误觉得用了ob_start()后,脚本的echo/print等输出就永远不会显示在涉猎器上了。因为PHP脚本运行收场后,会自动刷新缓冲区并输出内容。
ob 函数讲解的更多相关文章
- avascript中的this与函数讲解
徐某某 一个半路出家的野生程序员 javascript中的this与函数讲解 前言 javascript中没有块级作用域(es6以前),javascript中作用域分为函数作用域和全局作用域.并且,大 ...
- 结合php ob函数理解缓冲机制
对于一个刚刚入门的php程序员来说,php缓冲区是几乎透明的.在他们心目中,一个echo print_r 函数,数据便会‘嗖’的一声飞到浏览器上,显示出来.我也一直如此单纯地认为. 其实,在技术的世界 ...
- Python中高阶函数讲解
高阶函数讲解 1. 常规高阶函数 递归函数 格式:def func_name(variable): '''__doc__'''#函数的说明文档 if 条件表达式:#限制递归退出值 pass retur ...
- python ---split()函数讲解
python ---split()函数讲解 split中文翻译为分裂. 在python用于分割字符串使用. split()就是将一个字符串分裂成多个字符串组成的列表. split()可以传入参数,也可 ...
- ob 函数的使用
ob 函数的使用1. 页面静态化 $id = isset($_GET['id'])?$_GET['id']-0:0; $filename = "html/".date(" ...
- MySql UNIX_TIMESTAMP和FROM_UNIXTIME函数讲解
MySql UNIX_TIMESTAMP和FROM_UNIXTIME函数讲解 by:授客 QQ:1033553122 1. unix_timestamp(date)将时间转换为时间戳,如果参数为空,则 ...
- Spark Streaming中的操作函数讲解
Spark Streaming中的操作函数讲解 根据根据Spark官方文档中的描述,在Spark Streaming应用中,一个DStream对象可以调用多种操作,主要分为以下几类 Transform ...
- linux xfs文件系统无法用readdir获取dirent文件类型d_type则用stat获取暨stat函数讲解
stat函数讲解 表头文件: #include <sys/stat.h> #include <unistd.h>定义函数: int stat ...
- linux stat函数讲解 -(转自秋水Leo)
stat函数讲解表头文件: #include <sys/stat.h> #include <unistd.h>定义函数: int stat( ...
随机推荐
- PS如何精确设置参考线,标尺,辅助线
如图所示,我要均分画布的垂直方向为三份.因为要图标的三个位置文件吻合的很精确.我们先拉好头尾两条辅助线 在标尺上右击可以切换显示的单位,但是还是不够精确.因为这个画布是64×192的.我要64×64给 ...
- php正则表达式基本
一.正则表达式的组成 1.分隔符,可以是除了字母,数字,反斜线及空白以外的任何字符,比如/,!,#,%,|,~等;通常有/,!,~ 2.表达式:由一些特殊字符和非特殊字符组成. 3.修饰符:用于开启或 ...
- Laravel之中间件
一.中间件的作用 HTTP 中间件提供了一个便利的机制来过滤进入应用的 HTTP 请求.例如,Laravel 包含了一个中间件来验证用户是否经过授权,如果用户没有经过授权,中间件会将用户重定向到登录页 ...
- InnoDB事务和锁
InnoDB支持事务,MyISAM不支持事务. 一.事务的基本特性 ACID特性 1.原子性(Atomicity):事务是一个原子操作单元,其对数据的修改,要么全都执行,要么全都不执行. 2.一致性( ...
- vueAdmin使用动态路由时踩坑
在路由守护方法router.beforeEach中如果有使用动态路由,注意此时的路由对当前的router无效,下次路由时才起效. 导致的问题是---- 当页面刷新或重新打开页面时,无法找到当前路由(跳 ...
- mongo 游标
游标是什么? 通俗的说游标不是查询结果,而是查询的返回资源,或者说是查询返回的接口. 通过这个接口,我们可以逐条读取数据. 就像php中我们使用fopen打开文件,得到的是一个资源,通过这个资源,我们 ...
- Linux如何查看进程、杀死进程、查看端口等常用命令
查看进程号 1.ps 命令用于查看当前正在运行的进程.grep 是搜索 例如: ps -ef | grep java表示查看所有进程里 CMD 是 java 的进程信息2.ps -aux | grep ...
- 【拆分版】Docker-compose构建Elasticsearch 7.1.0集群
写在前边 搞了两三天了,一直有个问题困扰着我,ES集群中配置怎么能正确映射到主机上,这边经常报ClusterFormationFailureHelper master not discovered o ...
- 【转】【Python + selenium】linux和mac环境,驱动器chromedriver和测试报告HTMLTestRunner放置的位置
感谢: 作者:gz_tester,文章:<linux和mac环境,chromedriver和HTMLTestRunner放置的位置> 使用场景 配置python selenium 环境 使 ...
- Netty实战
一.Netty异步和事件驱动1.Java网络编程回顾socket.accept 阻塞socket.setsockopt /非阻塞2.NIO异步非阻塞a).nio 非阻塞的关键时使用选择器(java.n ...