为什么调用ob_flush()会减慢我的延迟?

时间:2013-01-22 18:03:28

标签: php apache buffer

我正在用PHP编写应用程序,我决定自己做一些测试来确定PHP处理缓冲区和缓冲的程度。具体来说,我想看看手动调用ob_start()ob_flush()是否会对我的程序产生巨大影响。

我召唤了10KB的lorem ipsum并开始工作。我在PHP的开始和结束时放了一个计时器,写入10KB的lipsum(显示:无div块)100次,总共1MB的数据,我认为这将是随机CPU的工作量。加载不会过多地抛弃我的数据。

除了PHP计时器之外,我还打开了Chrome的开发者工具(F12)并记录了“时间”和“延迟”字段。如果我的术语正确,“时间”是页面响应和呈现的总时间,“延迟”就是页面首次从服务器接收数据之前的时间。

所以这就是个谜:当我什么都不做,只写100x嘴唇100x时,我的平均值是:

PHP Time: 0.00630ms
Chrome Time: 565.6ms
Chrome Latency: 28.3ms

我一开始就拨打ob_start(),最后拨打ob_flush()

PHP Time: 0.00792ms
Chrome Time: 540ms
Chrome Latency: 33ms

然而,这是一个谜 - 当我在每个10KB文本块的开头和结尾调用ob_start()ob_flush()时,我的Chrome报告的延迟时间达到了4倍。

PHP Time: 0.005814ms
Chrome Time: 624.7ms
Chrome Latency: 134.9ms ???

据我所知,chrome延迟应该 cut 100倍,因为我正在通过PHP输出刷新缓冲区的1/100。我知道ob_start()ob_flush()在较高的缓冲区上运行,并且它们实际上刷新到较低的缓冲区,我希望较低的缓冲区以相同的间隔刷新,这意味着我会看到相同的等待时间。

我的测试装备是一款非常适中的英特尔ATOM上网本,带有Nvidia ION显卡,Windows 7家庭高级版(32位)和运行Apache 2.2.22的WAMP服务器,具有相当多的默认设置。我用的是Chrome 24.0.1312.52米。测试期间CPU负载适中但不是100%,而我的内存远远不够。

测试代码: http://pastebin.com/zf62Y4yz

谢谢!

1 个答案:

答案 0 :(得分:2)

ob_flush将内容发送给客户端。通过让PHP使用单个ob_flush确定何时或一次完成所有操作,它可以有效地批量发送http消息内部。当您在任意点手动分解时,在这种情况下,您每破解10K并执行至少一个手动包传输。此传输到客户端的延迟可能高于实际的php缓冲区刷新。

相关问题