学习笔记:PHP输出缓冲区

一、学习目标

  1. 了解PHP输出缓冲区概念、作用;
  2. 掌握PHP输出缓冲区函数、功能。

二、学习内容

1、什么是PHP输出缓冲区?

  • PHP输出缓冲区就像一个大内存盒子,里面可以包含多个PHP输出缓冲区层,就像PHP缓冲区里的一个一个小内存盒子;
  • PHP输出缓冲区用于暂存文本。当你通过PHP程序的echoprint等命令向WEB终端输出文本,它不会直接输出到WEB终端,而是先把这些文本内容放到PHP输出缓冲区(更具体表述应该是输出缓冲区里的一个层),等到满足一定条件后,再输出到WEB终端;

2、输出缓冲区层关系图

上面说到,PHP输出缓冲区里可以包含多个PHP输出缓冲区层,而PHP之外也有相应的输出缓冲区层,它们的关系图如下:
在这里插入图片描述
上图展示了PHP中三种缓冲区层的逻辑关系。

  • 上面的两层就是我们通常所认识到的“输出缓冲区”,最后一个是SAPI中的输出缓冲区,这些都是PHP中的层。当输出的字节离开PHP进入计算机体系结构中的更底层时,缓冲区又会不断出现(终端缓冲区(terminalbuffer),fast-cgi缓冲区,web服务器缓冲区,OS缓冲区,TCP/IP栈缓冲区。。。)。请记住一个通用原则,一个软件的很多部分都会先保留信息,然后再把它们传递到下一部分,直到最终把这些信息传递给用户。
  • CLI的SAPI有点特殊,这里重点讲一下。CLI会将INI配置中的output_buffer选项强制设置为0,这表示禁用默认PHP输出缓冲区。所以在CLI中,默认情况下你要输出的东西会直接传递到SAPI层,除非你手动调用ob_()类函数。并且在CLI中,implicit_flush的值也会被设置为1。我们经常会搞不清implicit_flush的作用,当implicit_flush被设置为打开(值为1),一旦有任何输出写入到SAPI缓冲区层,它都会立即刷新(flush,意思是把这些数据写入到更低层,并且缓冲区会被清空)。换句话说就是:任何时候当你写入任何数据到CLI SAPI中时,CLI SAPI都会立即将这些数据扔到它的下一层去,一般会是标准输出管道,write()和fflush()这两个函数就是负责干这个事情的。简单,对吧!

3、PHP中输出缓冲区相关配置

  • output_buffering:默认PHP输出缓冲区层大小;
  • implicit_flush:是否立即刷新SAPI缓冲区;
  • output_handler:设置缓冲区刷新之前的毁掉函数。

output_buffering:设置缓冲区大小

默认情况下,PHP发行版会在php.ini中把output_buffering设置为4096个字节。如果你不使用任何php.ini文件(或者也不会在启动PHP的时候使用-d选项),它的默认值将为0,这表示禁用输出缓冲区。

如果你将它的值设置为“ON”,那么默认的输出缓冲区的大小将是16kb。

默认的4k的设置是一个合适的值,这意味着你可以先写入4096个ASCII字符,然后再跟下面的SAPI层通信。

层与层之间的数据交换的次数越少,性能越好。你应该总是保持输出缓冲区处于可用状态,PHP会负责在请求结束后把它们中的内容传输给终端用户,你不用做任何事情。

implicit_flush:立即刷新SAPI输出缓冲区

当implicit_flush被

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值