当前位置:  编程技术>php

php output_buffering 缓存使用介绍

    来源: 互联网  发布时间:2014-10-11

    本文导语:  本节内容: php output_buffering 缓存使用实例。 buffer是一个内存地址空间,linux系统默认大小一般为4096(4kb)。 主要用于存储速度不同步的设备或优先级不同的设备之间传递数据的区域。 通过buffer可以使进程之间的相互等待变少...

本节内容:
php output_buffering 缓存使用实例。

buffer是一个内存地址空间,linux系统默认大小一般为4096(4kb)。
主要用于存储速度不同步的设备或优先级不同的设备之间传递数据的区域。
通过buffer可以使进程之间的相互等待变少。

例如,当打开一个文本编辑器,输入一个字符时,系统并不会立即写入磁盘。
而是存储在buffer中,当写满一个buffer时,才会把buffer的内容写入磁盘。
当然也可以使用flush强制将buffer的数据写入磁盘。
在php中,例如 echo,print,输出并不会立即通过tcp传递给浏览器输出。而是将数据写入php buffer。
当一个php buffer写满,才会通过tcp传递给浏览器。
echo /print -> php output_buffer -> tcp buffer -> browser

php output_buffering
默认情况下,php buffer是开启的,默认值是4096(4kb)。
可以在php.ini中找到output_buffering 配置。直到buffer写满,才会发送到浏览器。
也可以设置ob_start(),这样即使超过默认值(4kb)也不会立即发送到浏览器,只到脚本运行完成,或调用了ob_end_flush方法,才会输出到浏览器。

例1,output_buffering=4096,输出较少的数据(少于一个buffer)
 

代码示例:
 
 

运行结果:等所有脚本全部运行完成后,才输出,因为数据未满一个buffer的大小。

例2,output_buffering=4096,输出较少的数据(少于一个buffer),关闭output_buffering,修改php.ini的output_buffering=0
 

代码示例:
 
 

运行结果:
因为禁用了php buffering,不需要等到脚本运行完毕就可以输出,数据没有在php buffer停留,可以看到断断续续间歇性输出。
echo -> tcp buffer ->browser

例3,当output_buffering=4096,输出较大数据(大于一个buffer),不使用ob_start()
 

代码示例:
 
 

运行结果:
f.txt为一个大于4kb的文件,因为大于buffer默认值,buffer空间不够用,每当满一个buffer就会输出,所以可以看到间歇性输出。

例4,当output_buffering=4096,输出较大数据(大于一个buffer),使用ob_start()
 

代码示例:
 
 

运行结果:
因为使用了ob_start(),会为buffer设置足够大的空间,因此会保存到脚本执行完毕后才会输出。

output_buffering 方法
1.ob_start
激活output_buffering机制,一旦激活,脚本不再直接输出到浏览器,而是暂时写入php buffering区域。直到脚本运行完毕后,才发送。

2.ob_get_contents
获取php buffering中的数据,注意:要在ob_end_clean()前调用,否则只会得到空字符。

3.ob_end_flush 和 ob_end_clean
ob_end_flush 会输出php buffering 中的数据,但不会清空。
ob_end_clean 不会输出,只会清空php buffering中的数据。

注意:
ob_flush/flush在手册中的描述,都是刷新输出缓冲区,并且还需要配套使用。
其实, 他们俩的操作对象不同, 有些情况下, flush根本不做什么事情。

ob_*系列函数, 是操作PHP本身的输出缓冲区.
所以, ob_flush是刷新PHP自身的缓冲区。

而flush, 严格来讲, 这个只有在PHP做为apache的Module(handler或者filter)安装时,才有实际作用。
它是刷新WebServer(可以认为特指apache)的缓冲区.
在apache module的sapi下, flush会通过调用sapi_module的flush成员函数指针,间接调用apache的api: ap_rflush刷新apache的输出缓冲区。

有些Apache的模块,比如mod_gzip,可能自己进行输出缓存,这将导致flush()函数产生的结果不会立即被发送到客户端浏览器。
甚至浏览器也会在显示之前,缓存接收到的内容。

例如,Netscape浏览器会在接受到换行或 html 标记的开头之前缓存内容,并且在接受到 标记之前,不会显示出整个表格。
一些版本的 Microsoft Internet Explorer 只有当接受到的256个字节以后才开始显示该页面,所以必须发送一些额外的空格来让这些浏览器显示页面内容。

正确的使用顺序为:先ob_flush,后flush。
当然,在其他sapi下,不调用flush也可以,只不过为了保证代码的可移植性,建议配套使用。


    
 
 

您可能感兴趣的文章:

  • php缓冲 output_buffering和ob_start使用介绍
  • php页面缓存的例子 php缓存降低mysql压力
  • PHP缓存加速器 Alternative PHP Cache (APC)
  • 简单的php缓存类分享 php缓存机制
  • PHP本地缓存扩展 pcache
  • PHP文件型缓存解决方案 Secache
  • PHP的XML和JSON数据解析和缓存包 coreylib
  • PHP缓存管理包 HybridCache
  • PHP中4个加速、缓存扩展的区别和选用建议
  • php中操作memcached缓存进行增删改查数据的实现代码
  • PHP强制更新图片缓存的示例代码
  • PHP文件缓存内容保存格式实例分析
  • php apc缓存使用实例
  • 简单实用的网站PHP缓存类实例
  • 一个简洁实用的PHP缓存类完整实例
  • PHP缓存机制Output Control详解
  • php中apc缓存使用示例
  • 清除IE缓存的方法汇总(asp asp.net php等)
  • PHP之APC缓存详细介绍 apc模块安装
  • PHP模板引擎Smarty的缓存使用总结
  • PHP模板引擎Smarty缓存使用
  •  
    本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
    本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • php使用strip_tags从字符串中去除html标记
  • php输入流php://input使用示例(php发送图片流到服务器)
  • php使用socket_bind()函数绑定IP地址
  • php mvc使用htaccess隐藏index.php
  • php定义数组和使用示例(php数组的定义方法)
  • php生成数组的使用示例 php全组合算法
  • php导入excel php使用phpexcel导入excel文件
  • 如何使用crontab来定时执行一个.php的程序
  • php类声明和php类使用方法示例分享
  • 使用php检测用户当前使用的浏览器是否为IE浏览器
  • 怎么样在JSP中使用PHP的变量呀??
  • 使用Linux/UNIX的系统用户进行PHP用户登录验证
  • php 使用system() 调用c程序的问题
  • php跨域cookie共享使用方法
  • php5 pdo的配置与使用方法
  • 怎样在PHP网页里面使用Servlet?
  • php递归使用示例(php递归函数)
  • php命令行使用方法和命令行参数说明
  • 高分请教如何使用red had 7.3 自带的php
  • curl不使用文件存取cookie php使用curl获取cookie示例
  • php定界符<<<使用技巧和实例
  • 修改配置真正解决php文件上传大小限制问题(nginx+php)
  • IIS7配置PHP图解(IIS7+PHP_5.2.17/PHP_5.3.5)
  • PHP 5.4.19 和 PHP 5.5.3 发布及下载地址
  • PHP转换器 HipHop for PHP
  • 修改配置真正解决php文件上传大小限制问题(apache+php)
  • PHP 框架 Pop php
  • PHP去除html标签,php标记及css样式代码参考
  • PHP的JavaScript框架 PHP.JS
  • PHP 'ext/soap/php_xml.c'不完整修复存在多个任意文件泄露漏洞
  • 数据库 iis7站长之家


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3