本文主要介绍PHP中output_buffering的详细介绍。本文讲解了输出缓冲的一些高级用法,有需要的朋友可以参考一下。
个人认为输出缓冲是比较纯粹的4.0特性。虽然在概念上相当简单,但是输出缓冲功能非常强大,让开发者更容易开发出高级有效的程序。
本文将介绍HTTP头,以及输出缓冲如何帮助您处理HTTP头,并介绍输出缓冲的一些高级用法。
HTTP Header
对于使用HTTP协议建立的每个请求,Web服务器生成的响应通常由两部分组成——头部和主体。例如,如果Web服务器的文档根目录中有一个名为example.txt的小文本文件,该文件包含文本Hello,world!那么对该文件的HTTP请求响应如下:
复制代码如下:
HTTP/1.1 200没问题
日期:2000年9月2日星期六格林威治时间21时40分08秒
服务器:Apache/1 . 3 . 11(Unix)mod _ macro/1 . 1 . 1 PHP/4 . 0 . 2-dev
最后修改时间:2000年9月2日星期六21:39:49 GMT
ETag: '12600b-e-39b173a5 '
接受范围:字节
内容长度:14
连接:关闭
内容类型:文本/纯文本
你好,世界!
这个请求的第一部分(也就是more部分)是HTTP头。虽然用户在浏览器中看不到HTTP头,但它包含浏览器的信息,如文档内容类型、使用的协议版本、文档的最后更改日期等等。HTTP头没有太多规则。通常,其格式如下:
复制代码如下:
字段:值[字段:值]
它们必须用空行与文档正文分开。
您可以从PHP脚本中添加或更改这个HTTP头的信息。例如,您可以使用header()函数:
复制代码如下:
header(' Location:http://www . PHP . net/');//重定向到http://www.php.net/
您也可以使用SetCookie()函数:
复制代码如下:
SetCookie('foo ',' bar ');
您可能知道HTTP cookies是使用HTTP头实现的。例如,以下PHP文件的HTTP请求响应
复制代码如下:
?服务器端编程语言(Professional Hypertext Preprocessor的缩写)
SetCookie('foo ',' bar ');
打印“设置cookie”;
?
它看起来会像这样:
复制代码如下:
HTTP/1.1 200没问题
日期:2000年9月2日星期六格林威治时间21时43分02秒
服务器:Apache/1 . 3 . 11(Unix)mod _ macro/1 . 1 . 1 hph/4 . 0 . 2-dev
X-Powered-By: PHP/4.0.2-dev
Set-Cookie: foo=bar
连接:关闭
内容类型:文本/html
设置cookie。
当浏览器读取服务器返回的HTTP头时,它知道已经发送了一个名为foo的cookie(这里是一个会话cookie),它的值是bar。
为什么要使用Output Buffering技术
早在PHP/FI 2.0的时候,就很明显的需要输出缓冲技术。如果你用过这个版本的PHP,可能还记得经常会遇到header已经发出后调用了OOPS,setcookie的错误消息,这让你感到很困惑,想不通为什么。
如果你用过PHP的最新版本——PHP 3.0甚至PHP 4.0——那么你会知道这个错误信息:哎呀,PHP _ set _ cookie在header已经发送后被调用。或者,当你试图调用PHP的header()函数时,你会遇到消息不能添加头信息——头已经发送了。一般来说,输出缓冲技术的用户会避免这些恼人的错误消息,开发人员也可以将它们用于高级目的。
这些错误是什么时候发生的?如果您试图在发送HTTP标头后添加或修改标头信息,并且文档正文和标头之间有一个空行,将会生成这些错误消息。为了理解这是如何发生的,让我们看看PHP是如何处理HTTP头输出和正文输出的。
当脚本开始执行时,它可以发送头部信息和主体信息。
信息(来自Header()或SetCookie()函数)不会立即发送,而是保存到一个列表中。
这允许您修改标题信息,包括默认标题(例如,内容类型标题)。但是,一旦脚本发送了任何不是头的输出(例如,使用block或print()调用),那么PHP必须首先发送所有头,然后发送空行,终止HTTP头,然后继续发送主体数据。从那时起,任何添加或修改标题信息的尝试都是不允许的,并且会发送上述错误消息之一。
虽然这不会造成太大的问题,但有时它只是在发出任何输入之前终止HTTP头,从而使脚本逻辑变得复杂。输出缓冲技术可以解决这些问题。
Output Buffering的工作原理
当启用输出缓冲时,当脚本发送输出时,PHP不发送HTTP头。而是通过管道将这个输出输入到动态增加的缓存中(只能在PHP 4.0中使用,PHP 4.0有集中输出机制)。您仍然可以修改、添加标题行或设置cookie,因为标题实际上并没有被发送。最简单的情况,当脚本终止时,PHP会自动发送HTTP头给浏览器,然后发送输出缓冲区中的内容。很简单。
基本用法
您可以使用以下四个函数来帮助您控制输出缓冲:
复制代码如下:
ob_start()
启用输出缓冲机制。
输出缓冲支持多个级别——例如,ob_start()函数可以被多次调用。
ob_end_flush()
发送输出缓冲并禁用输出缓冲机制。
ob_end_clean()
清除输出缓冲而不发送,并禁用输出缓冲。
ob _ get _内容()
以字符串形式返回当前输出缓冲区。允许您处理脚本的任何输出。
另外可以启用php.ini中的output_buffering指令。如果启用了这个指令,那么每一个PHP脚本都相当于在开始的时候调用ob_start()函数。
Example 1
复制代码如下:
?PHP ob _ start();
h1示例1/h1
?服务器端编程语言(Professional Hypertext Preprocessor的缩写)
打印“你好,$用户”;
SetCookie('Wow ','即使我们已经发出了输出,这个Cookie还是被设置了!');
?
在这里,即使您已经发送了输出(在HTML代码块和print语句中),您也可以使用SetCookie()进行调用而不会出错,这要感谢输出缓冲机制。请注意,为此使用输出缓冲机制会导致一些性能损失,因此最好不要默认启用该机制。然而,对于更复杂的脚本,输出缓冲可以简化逻辑。
Example 2
复制代码如下:
?服务器端编程语言(Professional Hypertext Preprocessor的缩写)
ob _ start();
print '这里有一个非常简单的方法来计算字符串的长度。
$ length=strlen(ob _ get _ buffer());
ob _ end _ clean();
?
此示例显示了一种确定字符串长度的低效方法。它不是简单地使用strlen()函数,而是启用输出缓冲机制,打印出字符串,然后确定输出缓冲区的长度。最后,清除输出缓冲区(未发送),然后禁用输出缓冲机制。
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。