IIS7下PHP实时输出的奥秘:让flush()不再无效
在进行长时间操作的PHP任务时,我们往往希望将过程中的信息实时地展示在浏览器上,以让用户了解任务的进度。为此,我们通常会使用flush()函数来清空输出缓冲区,将内容发送到浏览器。但在IIS7中使用fastcgi模式配置PHP时,我们可能会发现flush()并不如预期那样工作,所有的输出似乎都在等待直到脚本结束才一起显示。
让我们来看一个示例代码段:
```php
for ($i=10; $i>0; $i--) {
echo $i.'
';
@ob_flush();
flush();
sleep(1);
}
```
此代码意在逐行显示数字,每秒钟更新一次,但在IIS的默认设置下,却会等到所有数字都生成完毕才一起显示。
为了解决这个问题,我们需要对IIS的配置进行一些调整。以下是解决方案:
打开文件 `C:\Windows\System32\isrv\config\applicationHost.config`。如果你的系统是64位的,确保使用64位的编辑软件打开该文件,否则可能会提示文件不存在。可以使用系统自带的记事本(Notepad)打开。找到PHP handler的部分,在其中的代码加入 `responseBufferLimit="0"`。
代码示例:
```xml
```
还需要确保phpi文件中的output_buffering设置为Off。
值得注意的是,不同浏览器可能会有不同的表现。在Internet Explorer中,上述设置通常可以正常工作,但在Chrome中,每个echo输出的内容必须包含HTML。如果输出的内容太短,可能无法实现实时显示的效果。为此,你可以在代码开始前输出一段空格或其他字符,例如使用`echo str_pad(' ', 1050);`来确保输出足够多的字符。
通过上述调整,你应该可以在IIS7的PHP fastcgi模式下成功实现实时输出,让用户在等待过程中获得更及时的信息反馈。