Mar*_*ery 5 php configuration output-buffering php-ini
我的网站的管理部分有一堆非常慢的报告生成脚本,它们echo按生成的顺序逐行输出.要将此输出立即刷新到浏览器,而不是用户在看到任何响应之前必须等待几分钟,我们已output_buffering禁用,并且我们ob_implicit_flush在此类脚本的开头调用.
为方便起见,我正在考虑打开implicit_flushphp.ini中的设置,而不是ob_implicit_flush()向每个可以从中受益的脚本添加调用.
但是,该文档包含以下可怕但无法解释的注释:
implicit_flush
...
在Web环境中使用PHP时,启用此选项会产生严重的性能影响,通常建议仅用于调试目的.
这些"严重的性能影响"是什么?他们是否证明了手册的推荐理由?
它可能是也可能不是手动在暗示,但一个语境中,无论是打开implicit_flush或呼叫ob_implicit_flush()通过使用PHP和Apache时有严重的性能问题是mod_php与mod_deflate启用.
在这种情况下,flush()调用能够将输出一直推mod_deflate送到浏览器.如果你有任何脚本以小块方式回显大量数据,那么刷新每个块将削弱mod_deflate压缩输出的能力,很可能导致"压缩"形式大于原始内容.
作为一个极端的例子,考虑这个简单的脚本,它回显了一百万个随机数:
<?php
header('Content-Type: text/plain');
for ($i=0; $i < 1000000; $i++) {
echo rand();
echo "\n";
}
?>
Run Code Online (Sandbox Code Playgroud)
随着output_buffering关闭,implicit_flush同时关闭(现在),让我们打这个在Chrome与开发者工具打开:

请注意"大小/内容"列; 解压缩的输出大小为10.0MB,但由于采用了mod_deflategzip压缩,整个响应压缩到4.8MB,大小减半.
现在点击完全相同的脚本implicit_flush设置为On:

再次,"解压缩"输出的大小为10.0MB.但是这一次,HTTP响应的大小是28.6MB - mod_deflate'''压缩'实际上是响应大小的三倍.
对我来说,这是足以理解PHP手册关闭implicit_flush配置选项的建议,并且仅在上下文中使用(或手动调用)这样做实际上有用的目的.ob_implicit_flush()flush()
| 归档时间: |
|
| 查看次数: |
1075 次 |
| 最近记录: |