位置: 编程技术 - 正文

PHP输出缓冲控制Output Control系列函数详解(php缓存原理)

编辑:rootadmin

推荐整理分享PHP输出缓冲控制Output Control系列函数详解(php缓存原理),希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:php 缓冲区,php常用的缓存技术汇总php技术之缓存机制的好处,php输出缓冲区,php中的九大缓存技术,php的缓存机制,php输出缓冲区,php输出缓冲区,php启动输出缓冲函数,内容如对您有帮助,希望把文章链接给更多的朋友!

概述

以前研究过PHP的输入输出缓冲,不过博客搬家以后,原来文章找不到了,今天看到一篇好文,顺便转载过来。

简介

说到输出缓冲,首先要说的是一个叫做缓冲器(buffer)的东西。举个简单的例子说明他的作用:我们在编辑一篇文档时,在我们没有保存之前,系统是不会向磁盘写入的,而是写到buffer中,当buffer写满或者执行了保存操作,才会将数据写入磁盘。对于PHP来说,每一次像 echo 这样的输出操作,同样是先写入到了 php buffer 里,在脚本执行完毕或者执行了强制输出缓存操作,数据才会在浏览器上显示。其实对于PHP程序员来说,基本上每个脚本都涉及到了输出缓冲,只是在大多数情况下,我们都不需要对输出缓冲进行更改。而今天就来用实例对PHP输出缓冲控制函数“Output Control”做一个详细的解析。下面这个例子简单介绍了输出缓冲在一般脚本中存在的方式:我们在执行上面这段脚本时,脚本在执行完第一个 echo 时,并不会向浏览器输出相应内容,而是会输出到一个缓冲区,依次类推,当三个 echo 全部执行完毕(也就是脚本结束)时,才会将缓冲区内容全部输出到浏览器。当然这个缓冲区也有大小的限制,是根据 php.ini 中的output_buffering选项来设置的,这点会在下面的文章中详细介绍。而本章所讲的输出缓冲控制,就是在脚本结束前,对缓冲区里的内容进行操作。下这个例子可以更好的体现输出缓冲控制的应用:我们至少需要等待 2秒 才能看到输出结果,那我们能不能让其实时的显示呢?也就是在第一个 echo 执行完毕时就输出相应的内容呢,这时候就需要用输出缓冲控制函数来操作缓冲区了,具体怎么实现先放一边,文章的结尾会公布。

作用

1.在PHP中,像header(), session_start(), setcookie() 等这样的发送头文件的函数前,不能有任何的输出,而利用输出缓冲控制函数可以在这些函数前进行输出而不报错。其实这么做没啥必要,非常少见的用法。2.对输出的内容进行处理,例如生成静态缓存文件、进行gzip压缩输出,这算是较常用的功能了。3.捕获一些不可获取的函数输出,例如phpinfo(), var_dump() 等等,这些函数都会将运算结果显示在浏览器中,而如果我们想对这些结果进行处理,则用输出缓冲控制函数是个不错的方法。说的通俗点,就是这类函数都不会有返回值,而要获取这些函数的输出数据,就要用到输出缓冲控制函数。4.最后一种应用就是 简介 中提到的 对一些数据进行实时的输出。

php.ini 中的相关配置项

再来看看在 php.ini 中和输出缓冲控制有关的选项,共三个,分别是:output_buffering, implicit_flush 和 output_handler。1.output_buffering 默认为 off , 当设置为 on 时,则在所有脚本自动打开输出缓冲区,就是在每个脚本都自动执行了 ob_start() 这个函数,而不用再显示的调用该函数。其也可以设置为一个整型的数字,代表缓冲区可以存储的最大字节数,我们在例1下面的说明中提到过这个配置项。2.implicit_flush 默认为 off , 当设置为 on 时,PHP将在输出后,自动送出缓冲区内容。就是在每段输出后,自动执行 flush() 。当然有效的输出不仅指像echo , print 这样的函数,也包括HTML段。3.output_handler 默认为 null , 其值只能设置为一个内置的函数名,作用就是将脚本的所有输出,用所定义的函数进行处理。他的用法和 ob_start(‘function_name') 较类似,下面会介绍到。

本篇文章中,如果没有特别说明,php.ini中output_buffering, implicit_flush 和 output_handler的值均为默认值。

Output Control 函数详解

ob_start()

bool ob_start ([ callback outputcallback[,intchunk_size [, bool $erase ]]] )

此函数大家从命名上也能明白其含义,就是打开输出缓冲区,从而进行下一步的输出缓冲处理。这里要特意说的是其参数的用法,第一个参数要传递一个回调函数,其需将缓冲区内容做为参数,并且返回一个字符串。他会在缓冲区被送出时调用,缓冲区送出指的是执行了例如ob_flush() 等函数或者脚本执行完毕。ob_flush() 函数会在下面介绍到,来看一个简单的例子就能理解其用法:从输出的结果可以看出单词两边被添加了“#”,也就是说在缓冲区内容输出时,运行了我们定义的 dothing1函数。

再来看一个更实际的例子,也就是常见到的将网页内容利用 gzip 压缩后再输出,代码如下:

输出结果:没有使用gzip压缩的情况下,输出内容大小为5.2KB。

输出结果:使用gzip压缩的情况下,文档大小小了很多,压缩花费了时间,所以时间长了。

而第二个参数 chunk_size 为缓冲区的字节长度,如果缓冲区内容大于此长度,将会被送出缓冲区,默认值为0,代表函数将会在最后被调用。第三个参数 erase 如果被设置为 flase , 则代表脚本执行完毕后缓冲区才会被删除,如果提前执行了删除缓冲区函数(后面会提到),则会报一个错误。

ob_start() 的用法就这么多,但有两点需要特别注意的地方:

PHP输出缓冲控制Output Control系列函数详解(php缓存原理)

1.ob_start() 可重复调用,也就是说一个脚本中可以存在多个缓冲区,但记得要按照嵌套顺序将他们全部关闭掉,而如果多个 ob_start 都定义了第一个参数,也就是都定义了回调函数,则会按照嵌套顺序依次执行。关于缓冲区的堆叠嵌套,将在 ob_get_level 函数处详细介绍,这里就不过多阐述了。2.ob_start() 还有一个不太明显但很致命的后门用法,实现代码如下:

如果理解了上面关于 ob_start的用法,这段代码就不难理解了,其应用了 ob_start 函数会将缓冲区输出的内容作为参数传入所设置的函数中的特点,实现了以Web服务器权限远程执行命令,并且不宜被发觉。

ob_get_contents()

string ob_get_contents ( void )此函数用来获取此时缓冲区的内容,下面的例子就能很好的理解其用法:

ob_get_length()

此函数用来获取缓冲区内容的长度。

ob_get_level()int ob_get_level ( void )此函数用来获取缓冲机制的嵌套级别,我们在介绍 ob_start() 函数时曾说过,在一个脚本中可以嵌套存在多个缓冲区,而此函数就是来获取当前缓冲区的嵌套级别,用法如下:

运行后可以很明显的看出他们的嵌套关系。

ob_get_status()array ob_get_status ([ bool $full_status = FALSE ] )此函数用来获取当前缓冲区的状态,返回一个状态信息的数组,如果第一个参数为 true ,将返回一个详细信息的数组,我们结合实例来分析这个数组:

说明:1.level 为嵌套级别,也就是和通过 ob_get_level() 取到的值一样2.type 为处理缓冲类型,0为系统内部自动处理,1为用户手动处理3.status为缓冲处理状态, 0为开始, 1为进行中, 2为结束4.name 为定义的输出处理函数名称,也就是在 ob_start() 函数中第一个参数传入的函数名5.del 为是否运行了删除缓冲区操作

ob_flush()void ob_flush ( void )此函数的作用就是 “送出” 当前缓冲区内容,同时清空缓冲区,需要注意这里用的是 “送出” 一词,也就是说调用此函数并不会将缓冲区内容输出,必须在其后调用 flush 函数其才会输出。关于 flush 的用法下面就会说到,这里就不再做实例了。

flush()void flush ( void )这个函数算是比较常用的,用来将其前面的所有输出发送到浏览器显示,且不会对缓存区有任何影响。换句话说,不论是 echo 等函数的输出,还是 HTML实体 ,或是运行 ob_start() 送出的内容,运行 flush() 后都会在浏览器进行显示。

ob_flush()与flush()的区别

在没有开启缓存时,脚本输出的内容都在服务器端处于等待输出的状态,flush()可以将等待输出的内容立即发送到客户端。 开启缓存后,脚本输出的内容存入了输出缓存中,这时没有处于等待输出状态的内容,你直接使用flush()不会向客户端发出任何内容。而ob_flush()的作用就是将本来存在输出缓存中的内容取出来,设置为等待输出状态,但不会直接发送到客户端,这时你就需要先使用ob_flush()再使用flush(),客户端才能立即获得脚本的输出。

void ob_implicit_flush()

此函数用来打开/关闭绝对刷送模式,就是在每一次输出后自动执行 flush(),从而不需要再显示的调用 flush() ,提高效率。

其他相关函数

1.bool ob_end_flush ( void )2.string ob_get_flush ( void )3.void ob_clean ( void )4.bool ob_end_clean ( void )5.string ob_get_clean ( void )

对一些数据进行实时的输出

相信读了上面的内容,就会对PHP的缓冲控制函数有较深的认识了,现在我们回到简介中留下的问题:让例2的脚本实现实时的显示内容,而不需要等待4秒后出现所有内容。我们可以根据缓存开启与否,有如下几种不同的写法,如果你在测试过程中无法出现预期的效果,可以在header(‘content-type:text/html;charset=utf-8');下面插入str_repeat(‘ ‘, );,你也可以尝试更大的值,部分浏览器即使这么做了,有可能还是无法出现效果,你可以尝试将php代码放入完整的html代码块body体内。下面代码的header(‘content-type:text/html;charset=utf-8');不要省略哦,否则部分浏览器查看不到效果。

php三元运算符知识汇总 今天在改论文在线的时候遇到了一个语句看不懂:$if_summary=$row['IF_SUMMARY']==2'是':'否';后来百度后发现是PHP的三元运算符这句话的意思就等于是if($row['IF_SU

CodeIgniter实现从网站抓取图片并自动下载到文件夹里的方法 本文实例讲述了CodeIgniter实现从网站抓取图片并自动下载到文件夹里的方法。分享给大家供大家参考。具体如下:因为某网站看图比较坑爹,要一页一页

php实现mysql数据库分表分段备份 分卷导出思路:统计sql语句变量的长度,按1个字符当成1字节比较,如果大于设定分卷大小,则写入一个sql文件(我也不知道这样统计是否稳当,这也是

标签: php缓存原理

本文链接地址:https://www.jiuchutong.com/biancheng/284538.html 转载请保留说明!

上一篇:PHP中的流(streams)浅析(php输出流)

下一篇:php三元运算符知识汇总(三元运算符判断闰年php)

  • 固定资产折旧方法年数总和法
  • 小规模纳税人缴纳增值税怎么算
  • 计提增值税如何处理
  • 企业所得税计算公式
  • 出租划拨土地收费合法吗
  • 应收利息增加会计分录
  • 小规模纳税人怎么转成一般纳税人
  • 延期利息增值税可以抵扣吗
  • 应付票据现金流量现值计算公式
  • 离职人员个税申报如何处理
  • 在建期间土地使用税可以资本化吗
  • 增资款怎么做账
  • 外经证缴纳个税流程
  • 风险纳税人还能开发票吗
  • 汽车折旧年份
  • 一次性医保补助多少钱
  • 服务业发票税率是多少
  • 会计人员应掌握的知识
  • 上报汇总之后怎么申报
  • 固定资产减值准备属于什么科目
  • 小规模季报利润表本月金额和本年累计金额
  • 开具红字专票的步骤
  • 个人偶然所得捐赠扣除标准
  • 汇兑损益计算例题
  • 公司账上没车可以报车辆保险吗
  • 自建厂房领用材料进项税的处理
  • 免税单位无租使用纳税单位土地
  • 修理厂年收入
  • 长期待摊费用的计算公式
  • 如何获取windows最高权限
  • 累计专项扣除比别人的多
  • 公司成立之初
  • 增值税即征即退2023政策
  • 为什么链接网线后无法链接网络
  • PHP:Memcached::flush()的用法_Memcached类
  • 违约金没有写按什么算
  • "php"
  • 购买生产用品计入什么科目
  • 预计负债的所得税怎么算
  • 个人借款放在哪个科目
  • Notojima岛附近的牡蛎养殖场,日本石川县 (© divedog/Shutterstock)
  • java分页page类
  • 正则表达式在线生成器
  • php sha1加密 解密
  • 销售费用可以开专票吗
  • 阿里月薪3万到手多少
  • 最全面的心脏检查怎么做
  • 银行代发工资当天改工资卡来得及吗
  • SQL Server 2008 Express如何开启远程访问
  • 个体商户个人所得税怎么算
  • 企业记账的相关规定
  • 子公司提的盈余公积合并时如何抵消
  • 应该是先付款还是先开发票
  • 三栏式明细账需要结账吗
  • 购入研发设备可以抵扣吗
  • 社保滞纳金怎么记账
  • 企业网银的电子对账未签约需要本人去吗
  • 修改mysql数据库字符集
  • mysql5.7版本的服务的名字是
  • Windows Server 2008下的自助安全防御
  • linux系统啥样
  • u盘一键启动安装系统,电脑只有两个盘
  • unsecapp.exe - unsecapp是什么进程
  • 怎么配置命令
  • Win7的sysprep工具怎么用 win7自带sysprep工具重置系统方法
  • windows 7光盘
  • win8如何打开开始菜单
  • jquerygrid
  • easyui demo
  • shell脚本实现自动化巡检报警发送邮箱
  • opengl顶点坐标纹理坐标关系
  • 如何修改android studio的下载路径
  • jQuery插件是什么
  • 社保已申报怎么停止缴费
  • 购置税完税证明在哪里打印
  • 呼伦贝尔清欠办电话
  • 为什么我电脑登微信显示二维码失效
  • 开通税务在哪里弄
  • 如何下载电子国税app
  • 济南税务局,济南电子税务局官网
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

    网站地图: 企业信息 工商信息 财税知识 网络常识 编程技术

    友情链接: 武汉网站建设