2013-01-22 43 views
4

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

我想起了10KB的lorem ipsum并去上班。我在for循环的开始和结尾放置了一个定时器,这个循环写入了10KB的lipum(显示:none div块)100次,共计1MB的数据,我认为这将足以使随机CPU加载不会太多地甩掉我的数据。

除了PHP定时器,我还弹出了Chrome的开发者工具(F12),并记录了“时间”和“延迟”字段。如果我的术语是正确的,那么“时间”是页面用于响应和渲染的总时间量,“延迟”只是页面第一次从服务器接收数据的时间。

因此,这里的奥秘:当我做什么,但写lipsum 100倍的10KB,我的平均数:

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 

然而,和这里的奥秘 - 当我打电话ob_start()ob_flush()在每个文本10KB块,由4X我的Chrome报告的延迟高峰的开始和结束。

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

据我所知,铬延迟应当削减通过100倍,因为我通过PHP输出冲水方式的缓冲1/100。我知道ob_start()ob_flush()在一个更高的缓冲区上运行,并且它们实际上会冲刷到一个较低的缓冲区中,我期望较低的缓冲区以相同的时间间隔进行刷新,这意味着我会看到相同的延迟时间。

我的测试平台是一个非常适中的Intel ATOM上网本,带有Nvidia ION图形,Windows 7家庭高级版(32位)和运行Apache 2.2.22的WAMPserver,具有相当多的默认设置。我使用Chrome 24.0.1312.52米。在测试过程中,CPU负载是中等的,但不是100%,我的内存不足。

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

谢谢!

回答

2

ob_flush将内容发送给客户端。通过让PHP确定它是什么时候或者一次完成一个ob_flush,它可以有效地批量发送http消息。当你手动将其分解时,在这种情况下,每打破10K,至少执行一次手动包传输。此传输到客户端的延迟可能比实际的php缓冲区刷新更高。

+0

这实际上是有道理的 - 我猜默认每4096个字节PHP刷新一次,这将匹配几乎完全是我的4倍放缓。谢谢! –

相关问题