PHP中的output

   这篇文章主要介绍了PHP中的output_buffering详细介绍,本文讲解了output buffering的一些高级用法,需要的朋友可以参考下

  我个人认为,Output buffering是比较纯粹的4.0特征。尽管从概念上看来相当简单,但是output buffering功能非常强大,能使开发者更容易地开发高级而有效的程序。

  本文将介绍HTTP header,以及output buffering如何帮助您处理HTTP header,并介绍了output buffering的一些高级用法。

 

  HTTP Header

  对 于使用HTTP 协议建立的每个请求,Web服务器产生的响应通常包括两个部分 – 标题和主体。例如,如果在Web服务器的文档根目录下有一个小文本文件,叫做example.txt,文件中包含文本Hello, world!,那么对此文件的HTTP 请求响应如下所示:

  代码如下:

  HTTP/1.1 200 OK

  Date: Sat, 02 Sep 2000 21:40:08 GMT

  Server: Apache/1.3.11 (Unix) mod_macro/1.1.1 PHP/4.0.2-dev

  Last-Modified: Sat, 02 Sep 2000 21:39:49 GMT

  ETag: "12600b-e-39b173a5"

  Accept-Ranges: bytes

  Content-Length: 14

  Connection: close

  Content-Type: text/plain

  Hello, world!

  这 个请求中的第一部分(就是较多的那部分)就是HTTP header。虽然用户在浏览器中看不到HTTP header,但它包含了用于浏览器的信息,例如文档内容类型,使用的协议版本,文档的最后更改日期等等。HTTP header并没有太多的规则,通常情况下,它的格式如下:

  代码如下:

  Field: Value[字段:值]

  必须用空行将它们和文档主体分开。

  可以从PHP脚本添加或更改此HTTP header的信息。例如,可以使用 header() 函数:

  代码如下:

  header("Location: http://www.php.net/"); // 重定向到 http://www.php.net/

  也可以使用 SetCookie() 函数:

  代码如下:

  SetCookie("foo", "bar");

  你可能会知道HTTP cookies是使用 HTTP headers 来实现的。例如,以下PHP文件的 HTTP 请求响应

  代码如下:

  <?php

  SetCookie("foo", "bar");

  print "Set cookie.";

  ?>

  将会是这样的:

  代码如下:

  HTTP/1.1 200 OK

  Date: Sat, 02 Sep 2000 21:43:02 GMT

  Server: Apache/1.3.11 (Unix) mod_macro/1.1.1PHP/4.0.2-dev

  X-Powered-By: PHP/4.0.2-dev

  Set-Cookie: foo=bar

  Connection: close

  Content-Type: text/html

  Set cookie.

  浏览器读取从服务器返回的 HTTP header,知道送来了一个叫做 foo 的 cookie (在这里是一个 session cookie),它的值是 bar。

 

  为什么要使用Output Buffering技术

  早 在PHP/FI 2.0时就很明显需要output buffering技术了。如果你使用过这种版本的PHP,那么可能还记得经常会碰到 Oops, SetCookie called after header has been sent 这个错误消息,并使你捎头抓耳,也弄不清是什么原因。

  如 果你已使用过PHP的最新版本 -- PHP 3.0 甚至 PHP 4.0 -- 那么你会知道这个错误消息: Oops, php_set_cookie called after header has been sent。或者,你在试图调用 PHP 的 header() 函数时会遇到 Cannot add header information - headers already sent 消息。一般来说,output buffering技术用户避免这些烦人的错误消息,同时开发人员也可用于高级的用途。

  这些错误是什么时候产生的呢?如果你在已经发送了HTTP header之后试图添加或修改标题信息,以及在文档主体和标题之间缺少空行时,就会产生这些错误消息。为了理解这是如何产生的,让我们来看看PHP是如何处理HTTP header输出和主体输出的。

  脚本开始执行时,它可以同时发送header(标题)信息和主体信息。

  Header信息(来自 header() 或 SetCookie() 函数)并不会立即发送,相反,它被保存到一个列表中。

  这样就可以允许你修改标题信息,包括缺省的标题(例如 Content-Type 标题)。但是,一旦脚本发送了任何非标题的输出(例如,使用块或 print() 调用),那么PHP就必须先发送所有的标题,然后再送出空行,终止 HTTP header,而在此之后才会继续发送主体数据。从这时开始,任何添加或修改标题信息的试图都是不允许的,并会发送上述的错误消息之一。

  虽然这并不会引起多大的问题,有时候只是在发出任何输入之前终止HTTP header,从而引起脚本逻辑的复杂化而已。Output buffering技术可以解决这些问题。

 

  Output Buffering的工作原理

  启用output buffering时,在脚本发送输出时,PHP并 不发送HTTP header。相反,它将此输出通过管道(pipe)输入到动态增加的缓存中(只能在PHP 4.0中使用,它具有中央化的输出机制)。你仍然可以修改,添加标题行,或者设置cookie,因为标题实际上并没有发送。最简单的情况是,当脚本终止 时,PHP将自动发送HTTP header到浏览器,然后再发送输出缓冲中的内容。这简单吧。

 

  基本用法

  可以使用下面的四个函数,它们可以帮助你控制output buffering:

  代码如下:

  ob_start()

  启用output buffering机制。

  Output buffering支持多层次 -- 例如,可以多次调用 ob_start() 函数。

  ob_end_flush()

  发送output buffer(输出缓冲)并禁用output buffering机制。

  ob_end_clean()

  清除output buffer但不发送,并禁用output buffering。

时间: 2024-09-10 23:01:04

PHP中的output的相关文章

SQL Server 2005数据库中的Output子句

SQL Server 2005中的output子句,可以使你从修改语句(insert.update. delete)中将数据返回到表变量中.带结果的DML的有用方案包括清除和存档.消 息处理应用程序以及其他方案.这一新的OUTPUT子句的语法为: OUTPUT INTO @table_variable 可以通过引用插入的表和删除的表来访问被修改的 行的旧/新映像,其方式与访问触发器类似.在 insert语句中,只能访问插入的 表.在delete语句中,只能访问删除的表.在update语句中,可以

如何使用数据查询的Parameters中的output属性取的返回值

数据 public int AddMessage(int moduleId, int fatherId, String userName, String title, String body, String face) {             if (userName.Length < 1) {                userName = "unknown";            }             // Create Instance of Connect

怎么用Eclipse调用weka中的output prediction功能?有没有对应的函数可以用?

问题描述 请问怎么用Eclipse调用weka中的outputprediction功能?有没有对应的函数可以用?或者给点提示也行..成分感激 解决方案 解决方案二:outputprediction具体是什么功能?解决方案三:就是用评价分类器时,显示出每个样例分到各个类中的概率.在Weka中分类功能Moreoption中可以选择.显示结果是:解决方案四:就是想在Ecplise中编程得到那个probabilitydistribution解决方案五:看源程序吧后台程序估计有我以前只是下载过但没看过..

J2EE中Servlet操作cookie

一.基本概念cookie是web服务器通过浏览器保存在www用户端硬盘上的一个文本文件,这个文件中包含了文本信息文本信息的内容是以"名/值"对的形式进行储存.可以让web开发者通过程序读写这个文本文件在Windows XP中保存Cookie的目录是:C:\Documents and Settings\用户名\Cookies. Cookie的作用是解决浏览器用户与web服务器之间无状态通信. 二.注意点 cookie的大小和数量是有限制的. cookie在个人硬盘上所保存的文本信息是以明

Servlet及JSP中的多线程同步问题

js|servlet|多线程|问题 Servlet/JSP技术和ASP.PHP等相比,由于其多线程运行而具有很高的执行效率.由于Servlet/JSP默认是以多线程模式执行的,所以,在编写代码时需要非常细致地考虑多线程的同步问题.然而,很多人编写Servlet/JSP程序时并没有注意到多线程同步的问题,这往往造成编写的程序在少量用户访问时没有任何问题,而在并发用户上升到一定值时,就会经常出现一些莫明其妙的问题,对于这类随机性的问题调试难度也很大. 一.在Servlet/JSP中的几种变量类型 在

如何避免iPhone应用中内存泄露

  创建对象时,所有权通过alloc.new.或者copy的方式建立,之后通过调用retain或者通过Cocoa函数来分配和复制对象的所有权. 内存释放有两种方式,一种方法是明确地请求释放对象的所有权,另一种方法则是使用自动释放池(auto-release pool). 所有权的背后是一个和引用有关的运算系统,iPhone SDK的大多数对象使用这个系统,彼此之间建立着很强的引用和参照. 当你创建一个对象时,引用值为1,调用一次retain则对象的引用值加1,调用一次release则对象的引用值

TensorFlow中RNN实现的正确打开方式

上周写的文章<完全图解RNN.RNN变体.Seq2Seq.Attention机制>介绍了一下RNN的几种结构,今天就来聊一聊如何在TensorFlow中实现这些结构,这篇文章的主要内容为: 一个完整的.循序渐进的学习TensorFlow中RNN实现的方法.这个学习路径的曲线较为平缓,应该可以减少不少学习精力,帮助大家少走弯路. 一些可能会踩的坑 TensorFlow源码分析 一个Char RNN实现示例,可以用来写诗,生成歌词,甚至可以用来写网络小说!(项目地址:https://github.

IAR中的Zstack工程产生的.hex通过SmartRF Flash Programmer烧录到CC2530

第一步:怎么产生.hex文件 1).hex的文件是不包含调试信息,由IAR产生. 打开IAR的工程选项,选中左边栏的Linker,如图所示. 勾中[Output file]下的选项,并将输出文件名的后缀改成hex:[Format]选项框里选中other,output后选择[intel-extened],其它的值保持默认即可. 但这样有个问题:产生的.hex 不带调试信息,不方便,我想产生两个文件,一个是带调试信息的,一个是不带的,不带的用于工程烧录,带调试的用于软件开发. 下面的摘自TI的Sma

怎么把@@error函数的值返回到C#的程序中啊

问题描述 谢谢啦! 解决方案 解决方案二:怎么才能让sql的@@error的值,传到.net中呢?谢谢啦!解决方案三:在PROCEDURE中设置OUTPUT参数,把@@error的值传给输出参数,再从.NET中接收此值即可.解决方案四:select@@erroraserror 然后和普通的SQL语法一样,在.NET里面处理就可以了.解决方案五:cmd=newSqlCommand("aaaa",conn);cmd.CommandType=CommandType.StoredProcedu