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 在加载时提供增量内容?
到目前为止尝试过的事情:
- php.ini - output_buffering = 关闭
- php.ini - implicit_flush = 开
- php.ini - zlib.output_compression = 关闭
- IIS 输出缓存 - .php = 阻止所有 caching/Prevent 所有缓存
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。输出现在应该在生成时流式传输到浏览器。
我是一名 Web 开发人员,经常在 Apache 和 IIS 托管项目之间切换。多年来,我注意到这两种环境之间有一个明显的区别。
在 Apache 中,如果我知道加载页面需要一段时间,我可以确定输出的优先级,以便首先显示屏幕的某些部分。相反,IIS 会等到整个页面完成加载后才会显示页面的任何部分。
示例:
<?php
echo "Hello ";
sleep(5);
echo "world.";
?>
在 Apache 中,上面的代码将显示 "Hello",然后 5 秒后将 "world." 添加到它。在 IIS 中 - 至少在其默认设置下 - 浏览器会等待 5 秒,然后立即显示 "Hello world."。
有人知道为什么会这样吗?更重要的是,鉴于对服务器的完全管理员访问权限,是否有办法强制 IIS 在加载时提供增量内容?
到目前为止尝试过的事情:
- php.ini - output_buffering = 关闭
- php.ini - implicit_flush = 开
- php.ini - zlib.output_compression = 关闭
- IIS 输出缓存 - .php = 阻止所有 caching/Prevent 所有缓存
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。输出现在应该在生成时流式传输到浏览器。