IIS 能否在页面仍在加载时提供增量内容?

Can IIS serve incremental content while the page is still loading?

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

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

示例:

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

在 Apache 中,上面的代码将显示 "Hello",然后 5 秒后将 "world." 添加到它。在 IIS 中 - 至少在其默认设置下 - 浏览器会等待 5 秒,然后立即显示 "Hello world."。

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

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

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

遗憾的是,Microsoft 并未在 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 管理器的处理程序映射下找到它,其中路径包含 *.php.

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