PHP输出缓存ob系列函数详解
OB的基本原理是:如果打开OB缓存,首先将回波数据放在ob缓存中,如果是头信息,则直接将其放入程序缓存中。当页面被执行到最后时,由OB缓存的数据被放置在程序缓存中,然后依次返回给浏览器。让我来谈谈OB的基本作用:
1)防止setcookie使用(),头(),或session_start(),和其他错误引起的头文件的功能在浏览器输出。事实上,这种使用良好的使用,养成良好的编码习惯。
2)捕捉一些函数的输出不能获得,比如phpinfo(),它会输出一个HTML语言很多,但我们不能用一个变量捕获,比如$信息= phpinfo(),和OB会在这段时间的工作。
3)对过程输出的内容,如gzip压缩,如翻译,比如字符串替换。
4)生成一个静态文件,它捕获整个页面的输出,然后将其保存为一个文件,通常用于生成HTML或整个页面缓存。
对于第三点,gzip压缩可能是很多人想用,但它并没有真正使用它。事实上,该代码稍作修改,可以实现对网页gzip压缩。
复制代码代码如下:ob_start(ob_gzhandler);
要缓存的内容
是的,加入ob_gzhandler回调函数是好的,但也有这样的一些小问题。首先,zlib支持是必要的,和两个不判断浏览器是否支持gzip。(现在看来一切都支持,iPhone浏览器似乎支持)。
以前的方法是判断浏览器是否支持gzip压缩,然后ob_get_contents含量()与第三方的gzip功能,然后回声。
ob系列函数中的公共函数集合
复制代码代码如下所示:
(ob_start / /);打开输出缓冲区,再输出所有的信息直接发送到浏览器,但存储在输出缓冲区。
(ob_clean); / /删除内容的缓冲区,缓冲区不封闭(输出)。
(ob_end_clean); / /删除内部缓冲区的内容,关闭缓冲(不输出)。
(ob_get_clean) / /回报;内部缓冲区的内容,关闭缓冲。相当于执行ob_get_contents()和()ob_end_clean
(ob_flush); / /发送内部缓冲区的内容到浏览器,删除内容的缓冲区,缓冲区不封闭。
(ob_end_flush); / /发送内部缓冲区的内容到浏览器,删除内容的缓冲区,缓冲区是封闭的。
(ob_get_flush);/ /返回的内部缓冲区的内容,并关闭缓冲区,然后释放缓冲区的内容。它相当于ob_end_flush()返回的缓冲区的内容。
同花顺(ob_flush); / /发布内容,并在PHP缓存的内容,所有输出到浏览器;刷新内部缓冲区的内容,并输出。
(ob_get_contents); / /返回缓冲区的内容,不输出。
(ob_get_length); / /返回缓冲区的长度,如果没有激活的缓冲,函数返回False。
ob_get_level(); / /返回的输出缓冲机制的嵌套层次。
ob_get_status(); / /输出缓冲器的状态。
ob_implicit_flush(绝对); / /打开或关闭刷新默认是关闭的,打开后ob_implicit_flush(真的),所谓绝对的刷新,当输出语句(如:回声)执行,输出直接发送到浏览器,而不再需要调用flush()或之前结束脚本输出。
的ob_gzhandler / / ob_start回调函数使用gzip压缩缓冲区的内容。
ob_list_handlers / /列表使用的所有输出处理程序
output_add_rewrite_var / /添加URL重写的值
output_reset_rewrite_vars / /复位URL重写的值
这些函数的行为是由php_ini设定的影响:
output_buffering / /值,输出将被用在所有的脚本控制;如果该值是一个数字,代表最大字节缓冲区的限制,当缓存内容达到上限将自动输出到浏览器缓存。电流的内容。
output_handler / /这个选项使用脚本的所有输出重定向到一个功能。例如,当output_handler设置mb_output_handler(),字符的编码将被修改为指定的代码。任何处理功能设置将自动处理输出缓冲器。
implicit_flush / /功能ob_implicit_flush,默认是关闭的。
两。实例说明
1。可以在头()函数之前拥有回声代码。
输出控制函数允许您自由控制脚本中数据的输出,这非常有用,尤其是当您希望输出数据时,输出文件头。
输出控制函数不影响发送的头文件头信息()或(),只有在setcookie相似,回波数据块()和PHP代码的行为。
复制代码如下:(ob_start) / /打开缓冲区;
你好;输出
头(地点:指标。php); / /重定向浏览器到index.php
(ob_end_flush); / /输出所有内容到浏览器
谁知道头()函数知道这个函数发送一个文件到浏览器,但如果有任何输出(包括空输出,如空格,回车和换行)使用此功能之前,它会提示一个错误。如果我们消除ob_start第一行()然后执行这个程序,我们会发现一个错误提示:头都准备好发送!但ob_start,会提示错误,原因是,当打开缓冲区字符不输出回波返回给浏览器,但保留在服务器,直到你使用冲洗或ob_end_flush输出,所以不会有任何输出文件时出错!
2。保存phpinfo()函数的输出
复制代码如下:(ob_start) / /打开缓冲区;
(phpinfo); / /使用phpinfo函数
$信息=(ob_get_contents); / /得到缓冲和分配至信息内容
文件大小= fopen('info .txt','w'); / /打开文件info.txt
文件(文件,为信息); / /写信息info.txt
Fclose(文件); / /关闭文件info.txt
三.静态模板技术
所谓的静态模板技术在某种程度上使用户位于PHP页面生成的HTML页面的客户端。如果HTML页面没有更新,那么当另一个用户再次访问该页面时,该程序将不再调用PHP和相关数据库。对于一些比较大的信息网站,如新浪、163、搜狐。这种技术的好处是非常巨大的。
复制代码如下:(ob_start) / /打开缓冲区;
PHP页面的所有输出
$content = ob_get_contents(PHP); / /把所有内容页输出
$ FP = fopen(output00001。HTML
fwrite($ FP,$content); / /把PHP页面写所有的output00001.html,然后......
Fclose($ FP);
三。输出缓存处理ob_gzhandler
php4.0.4有一个新的输出缓存处理,ob_gzhandler,这是类似于以前的课,但用不同。内容被添加到php.ini时使用ob_gzhandler如下:
复制代码如下:output_handler = ob_gzhandler;
这一行代码使PHP能够激活输出缓存并压缩它发送的所有内容。
如果你不想添加此代码的一些原因,你也可以更改默认的服务器的行为(不压缩)通过.htaccess文件所在的目录的PHP源文件的位置。语法如下:
复制代码代码如下:php_value output_handler ob_gzhandler
或从PHP代码调用,如下所示:
复制代码代码如下:ob_start(ob_gzhandler );
使用输出缓存处理方法确实有效,不会带来任何特殊的加载到服务器。但必须指出的是,Netscape Communicator已压缩的图形不支持,除非你能保证所有的用户使用IE浏览器,你应该禁止JPEG和GIF图形压缩的。一般来说,对于所有其他文件,这种压缩是有效的,但建议您测试分别对所有的浏览器,尤其是当你使用特殊的插件或数据查看器。
注意事项:uff1a
1,一些Web服务器的output_buffering是4069个字符或更大,即输出量必须达到4069个字符。服务器将刷新刷新输出缓冲区。为了确保冲洗的有效性,最好是在ob_flush有以下语句()函数。
复制代码如下:打印str_repeat(4096); / /为了保证达到output_buffering价值
2、本ob_ *系列函数是输出缓冲区操作的PHP本身,所以ob_flush只刷新PHP本身的缓冲液,冲洗是一个缓冲区刷新Apache。因此,两者的正确使用是:第一ob_flush,然后flush.ob_flush是从PHP缓存数据的发布,和冲洗是发送数据的内部和外部的缓冲到浏览器。
3、不要认为在使用ob_start(),回声/打印脚本的输出将不会被显示在浏览器中。因为PHP脚本运行结束后,它会自动刷新缓冲区和输出内容。