gpt4 book ai didi

php - 为什么调用 ob_flush() 会大大降低我的延迟?

转载 作者:可可西里 更新时间:2023-10-31 23:32:32 26 4
gpt4 key购买 nike

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

我想出了 10KB 的 lorem ipsum 并开始工作。我在 PHP 中在 for 循环的开始和结束处放置了一个计时器,该循环写入 10KB 的 lipsum(在 display:none div block 中)100 次,总共 1MB 的数据,我认为这足以让随机 CPU 工作负载不会过多地丢弃我的数据。

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

所以这就是谜团:当我只写 10KB 的 lipsum 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 文本 block 的开头和结尾调用 ob_start()ob_flush() 时,我的Chrome 报告的延迟峰值增加了 4 倍。

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

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

我的测试设备是一台非常普通的 Intel ATOM 上网本,带有 Nvidia ION 显卡、Windows 7 家庭高级版(32 位)和运行 Apache 2.2.22 的 WAMP 服务器,几乎都是默认设置。我使用的是 Chrome 24.0.1312.52 m。 CPU 负载适中,但在测试期间不是 100%,而且我的内存远未满。

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

谢谢!

最佳答案

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

关于php - 为什么调用 ob_flush() 会大大降低我的延迟?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14465113/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com