【问题标题】:nginx: trigger slow php-fpm process, but quickly return status 200nginx:触发缓慢的php-fpm进程,但很快返回状态200
【发布时间】:2016-08-02 14:50:54
【问题描述】:

是否可以让nginx触发一个php-fpm进程,然后关闭nginx worker并快速返回一个状态为200的空页面?

我有一些缓慢的 php 进程,需要每周启动几次。它们每个可能需要 3 到 4 分钟。我用cron manager site 触发它们。 php 进程在开始时会写入一个锁定文件,当该进程完成时会发送一封电子邮件,最后会删除锁定文件。

this guide 之后,在我的 php-fpm 工作池中,我有这个:request_terminate_timeout = 300,在我的 nginx 站点配置中我有 fastcgi_read_timeout 300;

它有效,但我不在乎屏幕上的结果。而且我使用的cron服务有5秒的时间限制,反复超时后,它会禁用作业。

是的,我知道我可以在 php 中 fork 一个进程,让它在后台运行,然后返回 200 给 nginx。是的,我可以支付和升级我的 cron 服务。尽管如此,无论如何,这将是一件有趣且有用的事情。

那么,这是可能的,还是 php-fpm 需要一个开放且“实时”的套接字?我问这个是因为在上面提到的“增加你的超时时间”页面上,一个答案说

“三个中最低的。是线链。Nginx->PHP-FPM->PHP。谁死 首先将打破链条”。

换句话说,这是否意味着我永远不能“触发”一个进程,然后关闭触发器的 nginx 部分?

【问题讨论】:

    标签: php nginx


    【解决方案1】:

    你可以。

    1. 通过添加尾随&来执行php cli脚本,将输出重定向到日志文件或/dev/null,将任何参数作为json或序列化(使用escapeshellarg())传递,exec将立即返回0(无错误);或
    2. 使用 php 的 ignore_user_abort(),发送 Connection: close 标头,刷新所有输出缓冲区以及普通的 flush()。之后放置任何慢代码。您需要在 Nginx 下对此进行测试。

    无论哪种方式,返回一个1xx 代码表示接受但没有响应。确保您的脚本不会永远运行取决于您;给它一个心跳,所以它@98​​7654328@es 每隔一段时间就会有一个文件。如果文件是旧文件并且仍在运行,请将其杀死。

    【讨论】:

    • 如果你可以这样做,第一个选项更可靠。否则在 php 的连接处理文档的 cmets 中有更多提示。
    • 谢谢@Walf - 你的第二个解决方案是我的答案。很遗憾我不能在这里发布代码,所以我将它作为一个单独的答案发布,感谢你,并将你的标记为解决方案。谢谢!
    【解决方案2】:

    感谢@Walf's answer 结合this example from the php sitethis SO answer 和一些小技巧,这似乎是一个 nginx 的解决方案,不需要弄乱任何 php 或 nginx ini 或 conf 文件。

    $start = microtime(true);
    ob_end_clean();
    header("Connection: close\r\n");
    header('X-Accel-Buffering: no');
    header("Content-Encoding: none\r\n");
    ignore_user_abort(true); // optional
    ob_start();
    echo ('Text user will see');
    $size = ob_get_length();
    header("Content-Length: $size");
    ob_end_flush();     // Strange behaviour, will not work
    flush();            // Unless both are called !
    ob_end_clean();
    sleep(35); // simulate something longer than default 30s timeout
    $time_elapsed_secs = microtime(true) - $start;
    echo $time_elapsed_secs; // you will never see this!
    

    或者,至少,它非常适合我想要它做的事情。感谢您的回答。

    【讨论】:

      猜你喜欢
      • 2019-02-21
      • 1970-01-01
      • 2020-03-04
      • 2013-12-26
      • 1970-01-01
      • 1970-01-01
      • 2012-10-14
      • 1970-01-01
      • 2015-05-09
      相关资源
      最近更新 更多