`
Cykit
  • 浏览: 23811 次
最近访客 更多访客>>
文章分类
社区版块
存档分类

[学习笔记]PHP页面输出缓存控制

阅读更多

有时我们需要页面内容完成生成后一次性输出,或者echo之后马上输出页面内存而不缓存,那么我们就会用到PHP的页面输出缓存控制的相关函数。

PHP页面输出缓存控制函数如下:
flush -- 刷新输出缓冲
ob_clean --  Clean (erase) the output buffer
ob_end_clean --  Clean (erase) the output buffer and turn off output buffering
ob_end_flush --  Flush (send) the output buffer and turn off output buffering
ob_flush --  Flush (send) the output buffer
ob_get_clean --  Get current buffer contents and delete current output buffer
ob_get_contents --  Return the contents of the output buffer
ob_get_flush --  Flush the output buffer, return it as a string and turn off output buffering
ob_get_length --  Return the length of the output buffer
ob_get_level --  Return the nesting level of the output buffering mechanism
ob_get_status --  Get status of output buffers
ob_gzhandler --  ob_start callback function to gzip output buffer
ob_implicit_flush --  Turn implicit flush on/off
ob_list_handlers --  List all output handlers in use
ob_start -- Turn on output buffering
output_add_rewrite_var --  Add URL rewriter values
output_reset_rewrite_vars --  Reset URL rewriter values

更加详细的用法见PHP用户手册,下面举一个简单的示例:

PHP 代码
  1. $str = 'Hello world";      
  2. echo $str;      
  3. sleep(10);  

这段代码会在sleep了10秒后在页面打印 Hello world。在看下面这段代码:

PHP 代码
  1. $str = 'Hello world";      
  2. echo $str . str_repeat(' ', 256);      
  3. ob_flush();      
  4. flush();     
  5. sleep(10);  

这段代码则会马上在屏幕上打印 Hello world。关键就在于第2和第3行调用的两个函数 ob_flush() 和 flush()。这两个函数得一起使用才能保证页面马上输出Hello world。其中str_repeat(' ', 256)则是为了解决某些浏览器必须在接收到256个字符后才会显示内容。下面的内容摘自《PHP用户手册》,很好地解释了上面的代码意图。

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

上面的代码演示了即时输出缓存,一般情况下该部分代码都能正常完成所要的功能,但是也会有例外

1)服务器打开了gzip等压缩功能,导致输出的缓存被压缩后不足256字节,那么在某些版本IE中也会等到凑够了256字节才输出内容(PS:之所以说某些版本的IE是因为我现在用的IE6就没有该问题,WINDOWS XP SP2)

2)如果这段代码之前还有代码,而且前面的代码中多次调用了ob_start()而ob_end_flush()调用的次数比ob_start()少2次,那么这上面的代码也不能正常工作。因为ob_start()的buffer是stackable的。调用多次ob_start()后,ob_flush()只会把buffer输出到上一层的buffer中。例如

调用ob_start(),它的缓存区为 buffer1,再次调用ob_start(),它的缓存区为buffer2。这时调用ob_flush()只会把 buffer2中的内容输出到 buffer1。这时如果调用 ob_end_flush(), 那么buffer2中的内容会被输出到 buffer1并且销毁buffer2。此时再调用ob_flush()就会把buffer1中的内容输出到服务器,然后调用flush()则可以把服务器中的buffer输出到客户端浏览器。

知道了ob_start()和ob_end_flush()的用法后,就可以用下面的代码来实现所有页面内容完全生成后一次性输出所有的缓存。

PHP 代码
  1. ob_start();   
  2.   
  3. //do something to generate $content   
  4. echo $content;   
  5.   
  6. ob_end_flush();   
  7. flush(); //if script is ending, this can be removed.   
  8.   

之所以要这么做是因为服务器会在缓存区满了以后就输出缓存而不是等到所以页面内容生成后再输出

分享到:
评论

相关推荐

    php页面静态化学习笔记.doc

    《PHP页面静态化学习笔记》 页面静态化是提高大型网站性能的重要技术手段,尤其在互联网领域,面对高流量和大数据量的挑战时显得尤为重要。本文将深入探讨PHP页面静态化的基本概念、技术原理和实现方式。 首先,...

    php模板引擎Smarty学习笔记(全)

    本学习笔记将详细介绍Smarty的核心概念、安装配置、基本用法以及一些高级特性。 1. Smarty核心概念: - 模板:HTML代码,其中包含特殊的SMARTY标记,用于插入动态数据。 - 配置文件:定义SMARTY的全局设置,如...

    传智播客PHP培训 页面静态化教程 PPT 笔记 软件

    1. **缓存技术**:使用PHP内置的`ob_start()`和`ob_get_contents()`函数来捕获页面的输出,并将其保存为HTML文件。当用户再次访问时,直接返回这个静态文件,而非重新执行PHP脚本。 2. **文件生成**:在用户请求...

    传智播客PHP培训.韩顺平 笔记

    5. **缓存功能**:学习如何开启和配置Smarty的缓存系统,以提高页面加载速度,降低服务器负载。 6. **安全机制**:了解Smarty的安全措施,如自动转义输出、防止XSS攻击等,确保应用的安全性。 7. **实际应用**:...

    韩顺平PHP从入门到精通笔记

    本笔记基于韩顺平的PHP从入门到精通视频课程,旨在帮助初学者系统学习PHP基础知识,逐步掌握PHP编程技能。 **HTML基础** 1. **HTML简介**:超文本标记语言(HTML)是网页设计的基础,用于展示文字、图像、视频等...

    传智韩顺平老师《全面掌握smarty模板技术》 韩顺平smarty笔记、源码、ppt、工具等

    本资源包由知名IT教育专家韩顺平老师提供,包含了他在讲解《全面掌握Smarty模板技术》课程时所用的笔记、源代码、PPT以及相关工具,旨在帮助学习者深入理解和运用Smarty。 首先,让我们详细了解一下Smarty的核心...

    Symfony2学习笔记之模板用法详解

    Twig使用`{{...}}`表示输出变量或表达式,`{%...%}`表示控制结构,如循环和条件判断,`{#...#}`用于添加注释。 4. **Twig的语法特性** - **双大括号** `{{...}}`:输出表达式或变量的值。 - **花括号百分号** `{...

    PHP 教程.docxPHP 教程.docx

    - **说明**:以上代码展示了如何在HTML页面中嵌入PHP代码来输出“Hello World!”。`<?php` 和 `?>` 是PHP代码块的起始和结束标记。 - **运行方式**:通过点击“运行实例”按钮可以在在线环境中查看运行结果。 #### ...

    smarty模版引擎技术

    2. 缓存:Smarty支持缓存编译后的模板,以提高页面加载速度。通过`cache_lifetime`设置缓存时间。 3. 安全性:可以通过设置`security`选项开启安全模式,限制模板中能使用的函数和变量。 4. 模板资源:可以配置...

    【免费】ThinkPHP3.1.2经典笔记

    ### ThinkPHP3.1.2经典笔记知识点详解 #### 一、ThinkPHP 框架简介 ##### 1.1 ThinkPHP 概述 - **ThinkPHP** 是一个开源的 PHP 开发框架,旨在简化 Web 应用程序的开发过程。它采用 MVC (Model-View-Controller) ...

    《Apache服务器配置与使用工作笔记》.(王江伟).[PDF].&ckook;

    ### Apache服务器配置与使用知识点详解 #### 一、Apache服务器简介...通过以上知识点的学习,读者可以深入了解Apache服务器的基本原理、配置方法及高级用法,从而更好地利用Apache构建稳定、高效、安全的Web服务环境。

    PHP脉客多众人帮H5任务悬赏系统源码 修复版.zip

    学习和使用这套源码,开发者可以深入了解PHP web应用开发,包括MVC架构、数据库设计、前端交互、服务器配置等多个方面,同时也可以借鉴其设计思路,为自己的项目提供参考。不过,在使用过程中,要注意遵守开源许可...

    Kplphp后台开发框架 v2.0.zip

    7. **安全特性**:为了保障应用安全,Kplphp可能集成了防止SQL注入、XSS攻击、CSRF(跨站请求伪造)等防护措施,并提供了输入验证和输出过滤的工具。 8. **性能优化**:版本升级通常伴随着性能的提升,Kplphp v2.0...

Global site tag (gtag.js) - Google Analytics