,,PHP中的output_buffering详细介绍

,,PHP中的output_buffering详细介绍

本文主要介绍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的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

相关文章阅读

  • 使用php连接mysql数据库,php连接数据库的方法
  • 使用php连接mysql数据库,php连接数据库的方法,一文详解PHP连接MySQL数据库的三种方式
  • 七种php开发环境搭建工具有哪些,七种php开发环境搭建工具包括
  • 七种php开发环境搭建工具有哪些,七种php开发环境搭建工具包括,七种PHP开发环境搭建工具
  • php高并发三种解决方法,php 高并发解决方案
  • php高并发三种解决方法,php 高并发解决方案,PHP解决高并发问题(opcache)
  • php邮件发送的两种方式区别,php邮件发送的两种方式是什么
  • php邮件发送的两种方式区别,php邮件发送的两种方式是什么,php邮件发送的两种方式
  • php跳转页面的几种实现方法详解图,php跳转页面的几种实现方法详解视频
  • php跳转页面的几种实现方法详解图,php跳转页面的几种实现方法详解视频,PHP跳转页面的几种实现方法详解
  • PHP购物车,php立即购买和购物车功能
  • PHP购物车,php立即购买和购物车功能,php实现购物车功能(上)
  • php读取pdf数据,php pdf读取
  • php读取pdf数据,php pdf读取,PHP中使用mpdf 导出PDF文件的实现方法
  • php网站判断用户是否是手机访问的方法有哪些,php如何判断用户是否登录
  • 留言与评论(共有 条评论)
       
    验证码: