【问题标题】:Why does calling ob_flush() slow down my latency so much?为什么调用 ob_flush() 会大大减慢我的延迟?
【发布时间】:2013-01-22 18:03:28
【问题描述】:

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

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

除了 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 文本块的开头和结尾分别调用 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() 在更高的缓冲区上运行,它们实际上会刷新到更低的缓冲区中,我希望更低的缓冲区以相同的间隔刷新,这意味着我会看到大约相同的延迟。

我的测试设备是一款非常普通的英特尔 ATOM 上网本,配备 Nvidia ION 显卡、Windows 7 家庭高级版(32 位)和运行 Apache 2.2.22 的 WAMPserver,几乎没有默认设置。我用的是 Chrome 24.0.1312.52 m。测试期间 CPU 负载适中,但不是 100%,而且我的 ram 远未满。

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

谢谢!

【问题讨论】:

    标签: php apache buffer


    【解决方案1】:

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

    【讨论】:

    • 这实际上是有道理的——我猜 PHP 默认每 4096 字节刷新一次,这几乎与我的 4 倍减速相匹配。谢谢!
    猜你喜欢
    • 1970-01-01
    • 2010-11-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-01
    • 2020-03-04
    • 1970-01-01
    相关资源
    最近更新 更多