文章目录
一、学习目标
- 了解PHP输出缓冲区概念、作用;
- 掌握PHP输出缓冲区函数、功能。
二、学习内容
1、什么是PHP输出缓冲区?
- PHP输出缓冲区就像一个大内存盒子,里面可以包含多个PHP输出缓冲区层,就像PHP缓冲区里的一个一个小内存盒子;
- PHP输出缓冲区用于暂存文本。当你通过PHP程序的
echo
或print
等命令向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被