PHP中输出缓冲

在PHP中,当执行echo,print的时候,输出并没有立即通过tcp传给客户端浏览器显示, 而是将数据写入php buffer。php output_buffering机制,意味在tcp buffer之前,建立了一新的队列,数据必须经过该队列。当一个php buffer写满的时候,脚本进程会将php buffer中的输出数据交给系统内核交由tcp传给浏览器显示。所以,数据会依次写到这几个地方echo/pring -> php buffer -> tcp buffer -> browser


在PHP中与刷新缓冲相关的函数有三个:

1). flush
刷新PHP程序的缓冲,而不论PHP执行在何种情况下。该函数将当前为止程序的所有输出发送到用户的浏览器。 但是该函数不会对服务器或客户端浏览器的缓存模式产生任何影响,也不会对PHP本身的缓存产生任何影响。

2).ob_flush

该函数对PHP本身的的缓存进行输出。PHP本身的缓存受php.ini中的output_buffering的控制。ob_flush()的作用就是将本来存在输出缓存中的内容取出来,设置为等待输出状态,但不会直接发送到客户端,这时你就需要先使用ob_flush()再使用flush(),客户端才能立即获得脚本的输出。

与PHP本身输出缓冲相关的两个PHP配置是:
参数1:output_buffering :on/off 或 者整数 。设置为on时,将在所有脚本中使用输出缓存控制,不限制缓存的大小。而设置为整数时,如output_buffering=4096,当缓存数 据达到4096字节时会自动输出刷新缓存。而这个参数的不同正是导致以上代码在不同时候执行结果不同的原因。当output_buffering关闭时, 脚本所有的输出(echo)都会即时发送到客户端,执行上面代码时就是每秒输出一个数字。而开启output_buffering后,输出内容就会先缓存
在服务端,直到脚本结束时才一起发送给客户端。
参数2:implicit_flush:on/off。设定ON意味着,当脚本有输出时,自动立即发送到客户端。相当于在echo后自动加flush()。

3).ob_implicit_flush

这个函数强制每当有输出的时候,即刻把输出发送到浏览器。这样就不需要每次输出(echo)后,都用flush()来发送到浏览器了。

例子

  1. <?php
  2. ob_end_clean();
  3. echo str_pad(" ", 256);
  4. for ($i=100; $i>0; $i--) {
  5. echo $i, '
    ';
  6. flush();
  7. sleep(1);
  8. }
  9. ?>

    以上代码应该隔一秒钟输出一次$i. 以上echo
    str_pad(" ", 256)的目的是IE需要接受到256个字节之后才开始显示。 以上代码还有以下两种写法。

    1. <?php
    2. echo str_pad(" ", 256);
    3. for ($i=100; $i>0; $i--) {
    4. echo $i, '
      />';
    5. ob_flush(); //有时候只有flush是不行的
    6. flush();
    7. sleep(1);
    8. }
    9. ?>

      view plain

      1. <?php
      2. ob_implicit_flush(true);
      3. echo str_pad(" ", 256);
      4. for ($i=100; $i>0; $i--) {
      5. echo $i, '
        />';
      6. ob_flush();
      7. sleep(1);
      8. }
      9. ?>
        另外我们还需要注意刷新缓冲不光受以上几方面的影响,还受以下影响:

        1). 个别web服务器程序,特别是Win32下的web服务器程序,在发送结果到浏览器之前,仍然会缓存脚本的输出,直到程序结束为止。有些Apache的模块,比如mod_gzip,可能自己进行输出缓存,这将导致flush()函 数产生的结果不会立即被发送到客户端浏览器。甚至浏览器也会在显示之前,缓存接收到的内容。例如 Netscape 浏览器会在接受到换行或 html
        标记的开头之前缓存内容,并且在接受到 标记之前,不会显示出整个表格。一些版本的 Microsoft Internet Explorer 只有当接受到的256个字节以后才开始显示该页面,所以必须发送一些额外的空格来让这些浏览器显示页面内容。

        下面是很简单的一段代码

        <?php
        	/*--------------------编写自己的缓存类---------------*/
        	class my_cache{
        
        	//定义有关变量
        		private $cache_time;//缓存有效时间
        		private  $cache_file;//缓存文件保存路径
        
        	//初始化类,默认是index.html时间是1
        		function __construct($cache_file='index.html',$cache_time="1"){
        			$this->cache_file=$cache_file;
        			$this->cache_time=$cache_time;
        		}
        	//缓存开始
        	function cache_start(){
        
        		if ($this->cache_active){
        			include($this->cache_file);
        			exit;
        	}
        		//开启缓存
        		ob_start();
        
        	}
        
        	//判断缓存文件是否存在并且可用
        		function cache_active(){
        				//判断文件是否存在
        			if(file_exists($this->cache_file)){
        				$last_time=@filemtime($this->cache_file);//获取最后修改时间
        				//判断时间是否可用
        				if($this->cache_time<$last_time){
        				//可用,包含进来直接显示
        					return true;
        					}else{
        				//删除该缓存,重新建立缓存
        						unlink($this->cache_file);
        						return false;
        					}
        			}
        		}
        
        	//进行缓存目录的生成
        			function cache_creat(){
        			//不用判断直接生成缓存文件目录及文件,循环生成文件
        			$file=explode("/", $this->cache_file);
        			$num=count($file)-1;
        			for ($i=0;$i<$num;$i++){
        			$tm.=$file[$i]."/";
        				if (!file_exists($tm)){
        					mkdir($tm);
        				}
        			}
        		}
        
        	//缓存的输出
        	function cache_end(){
        		$cache_content=ob_get_contents();
        		$this->cache_creat();
        		$fp=@fopen($this->cache_file, "w+");
        		fwrite($fp, $cache_content);
        		ob_end_flush();
        	}	
        
        	//缓存的清除
        	function cache_clean(){
        		if(unlink($this->cache_file)){
        			return true;
        		}else {
        			$this->alert("缓存删除失败!请检查缓存文件是否存在");
        			return false;
        		}
        
        	}
        
        	//定义缓存文件的提醒函数
        	function alert($a){
        		echo "<script>alert('$a');</script>";
        
        	}
        }
        ?>
        
        测试页面test.php
        
        <?
        include 'cache_my_class.php';
        $my_cache=new my_cache("./chunge/ge/hao/index.html",5);
        $my_cache->cache_start(); //在页面的最开始 
        
        -------页面输出
        
        $like="我爱吃橘子香蕉!";
        echo $like."";
        $my_cache->cache_end();//最后进行输出
        

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索客户端
, 缓存
, 浏览器
, 脚本
, php缓存
, 输出
, pring
, pring batchwebservice
, 输出不缓存
, php刷新缓冲区
, 刷新输出缓冲区
, output_buffering
, PHP输出
输出显示
php输出缓冲区、php 输出缓冲、php 输出缓冲区数据块、输出缓冲区、输出缓冲区数据块设置,以便于您获取更多的相关知识。

时间: 2024-12-02 13:49:29

PHP中输出缓冲的相关文章

剖析 PHP 中的输出缓冲_php技巧

我们先来看一段代码:     〈?php     for ($i=10; $i〉0; $i--)     {      echo $i;      flush();      sleep(1);     }     ?〉     按照php手册里的说法,该函数将当前为止程序的所有输出发送到用户的浏览器.     上面的这段代码,应该隔一秒钟输出一次$i.但是实际中却不一定是这样.有可能是等了10秒钟后,所有的输出同时呈现出来.     好,我们来改一下这段代码,改成     〈?php     

剖析PHP中的输出缓冲 flush之类

我们先来看一段代码. <?phpfor ($i=10; $i>0; $i--){    echo $i;    flush();    sleep(1);}?> 按照php手册里的说法     该函数将当前为止程序的所有输出发送到用户的浏览器. 上面的这段代码,应该隔一秒钟输出一次$i.但是实际中却不一定是这样.有可能是等了10秒钟后,所有的输出同时呈现出来. 好,我们来改一下这段代码,改成 <?phpob_end_clean();//修改部分for ($i=10; $i>0

关于输出缓冲的讨论(Output buffering)之一

###########################################标题  关于输出缓冲的讨论##整理  Diego Lynn @ 林全国##原作  By Zeev Suraski ######################################### 关于输出缓冲的讨论(Output buffering) 目录 HTTP Header为什么要使用Output Buffering技术Output Buffering的工作原理基本用法高级用法使事情更为简单哈哈,我成功

Output Buffer (输出缓冲)函数的妙用

函数 在PHP编程中, 我们经常会遇到一些直接产生输出的函数, 如passthru(),readfile(), var_dump() 等. 但有时我们想把这些函数的输出导入到文件中,或者先经过处理再输出, 或者把这些函数的输出作为字符串来处理. 这时我们就要用到 Output Buffer(输出缓冲) 函数了. 处理输出缓冲的函数主要有这么几个: ob_start() 开始输出缓冲, 这时PHP停止输出, 在这以后的输出都被转到一个内部的缓冲里. ob_get_contents() 这个函数返回

PHP输出缓冲控制Output Control系列函数详解

  这篇文章主要介绍了PHP输出缓冲控制Output Control系列函数详解,本文讲解了输出缓冲的简介.输出缓冲的作用.php.ini 中的相关配置项.Output Control 函数详解等内容,需要的朋友可以参考下 概述 以前研究过PHP的输入输出缓冲,不过博客搬家以后,原来文章找不到了,今天看到一篇好文,顺便转载过来. 简介 说到输出缓冲,首先要说的是一个叫做缓冲器(buffer)的东西.举个简单的例子说明他的作用:我们在编辑一篇文档时,在我们没有保存之前,系统是不会向磁盘写入的,而是

PHP嵌套输出缓冲代码实例

  这篇文章主要介绍了PHP嵌套输出缓冲代码实例,本文讲解嵌套使用ob系列函数的实例,需要的朋友可以参考下 PHP的输出缓存是可以嵌套的.用ob_get_level()就可以输出嵌套级别. 测试发现在cli和浏览器下输出结果不一样(PHP5.4). 手册说明如下: ob_get_level() will always return 0 inside a destructor. This happens because the garbage collection for output buffe

关于PHP输出缓冲函数的一些使用技巧

本文转自IT摆渡网欢迎转载,请标明出处 更多php文章请阅读 php问题解决 在PHP中, Output Buffer输出缓冲函数可以将一些直接产生输出的函数, 如passthru(),var_dump() 等的结果导入到文件中,或者经过处理再输出, 或者作为字符串来处理,在PHP中,处理输出缓冲的函数主要有以下几个: ob_start() 函数:开始输出缓冲, 此时PHP将停止输出, 在这之后的输出都被暂存在内部的缓冲里供以后使用. ob_get_contents() 函数:返回内部缓冲里的内

PHP嵌套输出缓冲代码实例_php实例

PHP的输出缓存是可以嵌套的.用ob_get_level()就可以输出嵌套级别. 测试发现在cli和浏览器下输出结果不一样(PHP5.4). 手册说明如下: ob_get_level() will always return 0 inside a destructor. This happens because the garbage collection for output buffers has already done before the destructor is called 想要

PHP 输出缓冲控制(Output Control)详解_php技巧

  php 缓冲简介       其实我对php ob 系列印象还是很模糊,具体怎么玩的,还不是很了解,平时curd,确实对这些内容没有深入.作为phper 甚是惭愧.网上搜了一通,互相copy,代码运行不能出现作者所描述现象,本文良心出品,代码都是作者运行过.   当执行输出的时候,比如 echo,print.输出并没有立即送给 web server, 而是将数据写入 php buffer.php output_buffering 机制好处当然提升性能.其实 php 文件最终在浏览器上显示,走