首页 > 解决方案 > IIS 能否在页面仍在加载时提供增量内容?

问题描述

我是一名 Web 开发人员,经常在 Apache 和 IIS 托管项目之间切换。多年来,我注意到这两种环境之间的一个明显区别。

在 Apache 中,如果我知道页面需要一段时间才能加载,我可以优先输出输出,以便屏幕的某些部分首先显示。相反,IIS 会等到整个页面加载完成后才会显示它的任何部分。

例子:

<?php
echo "Hello ";
sleep(5);
echo "world.";
?>

在 Apache 中,上面的代码会显示“Hello”,然后 5 秒后附加“world”。给它。在 IIS 中——至少在其默认设置下——浏览器会等待 5 秒,然后显示“Hello world”。一次全部。

有人知道为什么会这样吗?更重要的是,给定对服务器的完全管理员访问权限,是否有办法强制 IIS 在加载时提供增量内容

到目前为止尝试过的事情:

标签: iisiis-7

解决方案


FastCGI——在 IIS 中运行 PHP 的最常见方式——默认配置为在将一定数量的数据刷新到浏览器之前对其进行缓冲;所以我们需要禁用这个缓冲区,或者设置responseBufferLimit为 0。

不幸的是,微软并没有在 中公开这个选项FastCGI Settings,所以我们必须直接在一个名为applicationHost.config. 您可以在服务器的硬盘驱动器中搜索此文件,或签入C:\Windows\System32\inetsrv\config\applicationHost.config

在文本编辑器中打开此文件并搜索以<handlers. 在本节中,您的 FastCGI 实例应该有一个条目。我们需要修改此条目以添加responseBufferLimit="0"为参数。

前:

<add name="PHP_via_FastCGI" path="*.php" verb="GET,HEAD,POST", modules="FastCgiModule", scriptProcessor="C:\Program Files\PHP\v7.2\php-cgi.exe" resourceType="Either" />

后:

<add name="PHP_via_FastCGI" path="*.php" verb="GET,HEAD,POST", modules="FastCgiModule", scriptProcessor="C:\Program Files\PHP\v7.2\php-cgi.exe" resourceType="Either" responseBufferLimit="0" />

或者,您可以使用命令行:

C:\Windows\SysWOW64\inetsrv>appcmd.exe set config /section:handlers "/[name='PHP_via_FastCGI'].ResponseBufferLimit:0"

PHP_via_FastCGI分配给 PHP 处理程序的名称在哪里。如果您不确定,可以在 IIS 管理器中的 Handler Mappings 下找到,其中 Path 包含*.php.

将响应缓冲区限制设置为 0 后,重新启动 IIS。输出现在应该在生成时流式传输到浏览器。


推荐阅读