PHP 8
我正在使用最新的 NGINX 功能 un WHM 96....我可以打开或关闭开关以让 nginx 缓存所有内容,并且它运行良好且速度非常快。
**** 但是:当我有一个执行大量回声的脚本时,NGINX 将等待,直到所有回声都处理完毕。
在完全相同的服务器中,只需关闭 NGINX:所有回显都将被推送。
最简单的代码示例
<?php
for ($x = 0; $x <= 10; $x++) {
echo "dot "; sleep(1);
}
?>
使用 apache => 我看到点(等待 1 秒)、点(等待 1 秒)、点(等待 1 秒)、点(等待 1 秒)
使用 NGINX => 我等待 10 秒并看到所有 10 个点.....
有没有办法让 NGINX 保持开启并在处理效果时具有相同的回声?
答案1
基本上,apache2 具有较小的缓冲区,导致其流式传输,而 nginx 则缓冲您的输出。
<?php
$multiple = 1;
$size = 1024 * $multiple;
for($i = 1; $i <= $size; $i++) {
echo ".";
}
sleep(5);
echo "Hello World";
?>
如果你运行这个示例,你会看到浏览器的加载指示器直到五秒钟后才显示正在接收数据。现在,让我们改变$multipe从 1 到 8,然后点击刷新。如果没有配置任何特定设置,您会注意到浏览器告诉我们它几乎立即开始接收一些数据,无需等待。无需等待五秒钟即可意识到页面已开始加载,这对客户体验非常好。
你可能想知道为什么我们设置$多个从 1 到 8。这背后的原因与 Web 服务器的缓冲区有关。第一级是 PHP 缓冲,我们可以通过 PHP 的 output_buffering 设置进行检查。PHP 的后端(CGI、mod_php、FastCGI)缓冲也可能存在问题,最后可能是 Web 服务器的缓冲。
通常,Nginx 和 Apache 缓冲内容的最大大小为 4KB 或 8KB,具体取决于所使用的操作系统。通常,在 64 位操作系统上,限制为 8KB,在 32 位操作系统上,限制为 4KB。
由于 nginx 和 apache2 都共享对 PHP 的支持,因此实现通用修复的最佳方法是使用共同支持的层 PHP。
总而言之,您需要的是flush();
andob_flush();
函数来强制将数据从缓冲区中移出。类似下面的代码即可实现此目的:
<?php
for ($x = 0; $x <= 10; $x++) {
echo "dot "; sleep(1);
ob_flush();
flush();
}
?>
更多信息请点击这里:https://www.php.net/manual/en/function.ob-flush.php
答案2
根据https://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_buffering
我更改了 nginx.conf 和虚拟主机以关闭 proxy_buffering; 指令如下:
http {
proxy_buffering off;
}
server {
proxy_buffering off;
}
并解决了这个问题;)