php缓冲区 一些笔记
今天在代码中看到了ob_clean函数,在php文档中他的作用是清空(擦掉)输出缓冲区
然后就认真查了下,什么是输入缓冲区?
以下讨论的是php5.4以上版本,
什么是输出缓冲区?
三点:1、如何会输出点什么东西的函数(echo,print)都会用到输出缓冲区,这里说的是用php写的程序,如果php扩展,你是用的函数(c函数)可能会直接输出写到sapi缓冲区层,而不需要经过ob层
2、输出缓冲区不是唯一用于缓冲输出的层,它实际上只是很多层中的一个,
3、输出缓冲区层的行为跟你使用的sapi相关,不同的sapi可能有不同的行为
默认php输出缓冲区
默认情况下,PHP发行版会在php.ini中把output_buffering 设置为4096,在web应用环境中对输入的内容使用缓冲区对性能有好处,默认的4k的设置是一个合适的值,并且在文本应用环境中,通过socket一个字节一个字节的传输消息的方式对性能并不好,更好的方式是把所有的内容一次性的传输到服务器,层与层之间的数据交换的次数越少,性能越好,你应该总是保持输出缓冲区处于可用状态,php会负责在请求结束后吧他们中的内容传输给终端用户。
缓冲区的内容会传递给你选择的回调函数来执行内容转换的工作,所以如果你想获取php传输给web服务器以及用户的内容,你可以使用输入缓冲区回调
消息头和消息体
当你使用一个输出缓冲区(无论是用户的,还是PHP的)的时候,你可能想以你希望的方式发送HTTP消息头和内容。你知道任何协议都必须在发送消息体之前发送消息头(这也是为什么叫做“头”),但是如果你使用了输出缓冲区层,那么PHP会接管这些,而不需要你操心。实际上,任何跟消息头的输出有关的PHP函数(header(),setcookie(),session_start())都使用了内部的sapi_header_op()函数,这个函数只会把内容写入到消息头缓冲区中。然后当你输出内容是,例如使用printf(),这些内容会写入到输出缓冲区(假设只有一个)。当这个输出缓冲区中的内容需要被发送时,PHP会先发送消息头,然后发送消息体。PHP为你搞定了所有的事情。如果你觉得不爽,想自己动手,那你就只有把输出缓冲区禁用掉,除此之外别无他法。
总结
输出层(output layer)就像一个网,它会把所有从PHP”遗漏“的输出圈起来,然后把它们保存到一个大小固定的缓冲区中。当缓冲区被填满了的时,里面的内容会刷新(写入)到下一层(如果有的话),或者是写入到下面的逻辑层:SAPI缓冲区。开发人员可以控制缓冲区的数量、大小以及在每个缓冲区层可以执行的操作(清除、刷新和删除)。这种方式非常灵活,它允许库和框架设计者可以完全控制它们自己输出的内容,并把它们放到一个全局的缓冲区中。对于输出,我们需要知道任何输出流的内容和任何HTTP消息头,PHP都会以正确的顺序发送它们。
输出缓冲区也有一个默认缓冲区,可以通过设置3个INI配置选项来控制它,它们是为了防止出现过大量的细小的写入操作,从而造成访问SAPI层过于频繁,这样网络消耗会很大,不利于性能。PHP的扩展也可以定义回调函数,然后在每个缓冲区上执行这个回调,这种应用已经有很多了,例如执行数据压缩,HTTP消息头管理以及搞很多其他的事情。