iis - 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 = On
- php.ini - zlib.output_compression = 关闭
- IIS 输出缓存 - .php = 阻止所有缓存/阻止所有缓存
解决方案
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。输出现在应该在生成时流式传输到浏览器。
推荐阅读
- tensorflow - 更改为使用 tf.data api 后,Keras 模型无法学习任何东西
- neo4j - 将 CSV 文件导入 Neo4J 需要很长时间
- java - Android Firebase:第二个连接的数据库不允许在规则中进行身份验证
- r - 非英语术语文档矩阵
- json - 加载捆绑在可执行文件中的 json 文件
- html - 容器 div 不适应子 Angular 组件高度
- java - 将括号括在 Excel 公式的文件名中
- javascript - 字段值的乘法
- python - 如何使用 python-pptx 按演示文稿中的顺序从 powerpoint 文本框中提取文本。
- git - 如何在 git 中获取旧版本的文件