【问题标题】:Can't get nginx to flush buffer with php7-fpm无法让 nginx 使用 php7-fpm 刷新缓冲区
【发布时间】:2019-05-15 02:57:28
【问题描述】:

我需要一个运行时间较长(7-8 秒)的 php 脚本,以便在发现部分结果时向用户输出部分结果。我以前可以通过执行以下操作使用旧版本的 php-fpm 和 nginx 来完成此操作:

  1. 在 php 中使用这些配置设置:
@ini_set('output_buffering', 0);
@ini_set('implicit_flush', 1);
@ini_set('zlib.output_compression', 0);
@ob_end_clean();
set_time_limit(0);
header('X-Accel-Buffering: no');

每次我需要输出部分结果时都运行ob_implicit_flush(1); flush();

  1. 对 nginx 使用这些指令:
 fastcgi_keep_conn on;
 proxy_buffering off;
 gzip off;

但是,随着升级到 PHP 7 和 nginx 1.10.3,这些设置不再起作用。

我已经尝试将这些指令添加到 nginx:

 fastcgi_max_temp_file_size 0;
 fastcgi_store off;
 fastcgi_buffering off;

但这些似乎也没有任何作用。结果仍然被缓冲,直到 php 脚本完成运行,然后一次性发送。

我的要求还有可能吗?

(我很欣赏有关发送不涉及禁用缓冲区的部分结果的其他方法的建议,但这不是我的问题的一部分)。

【问题讨论】:

    标签: php nginx fastcgi


    【解决方案1】:

    想想你能做到这一点的唯一方法就是你可以将初始脚本拆分为多个脚本。

    然后您可以使用 ajax 从前端调用每个脚本并将内容附加到 dom。

    PHP 脚本大部分是同步的。但是通过执行 ajax 调用(那些运行异步),您可以并行执行多个 php 脚本。

    【讨论】:

    • 为什么这在以前的 php-fpm + nginx 版本中有效?发生了什么变化?
    猜你喜欢
    • 2013-07-15
    • 1970-01-01
    • 2018-07-11
    • 1970-01-01
    • 2013-11-29
    • 2020-01-18
    • 1970-01-01
    • 2016-12-26
    • 2015-08-10
    相关资源
    最近更新 更多