nginx 在处理时回显不起作用,但装有 apache 的同一台服务器可以在处理时回显

nginx 在处理时回显不起作用,但装有 apache 的同一台服务器可以在处理时回显

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;
}

并解决了这个问题;)

相关内容