php max_execution_time 未记入帐户

问题描述 投票:0回答:1

我有 Nginx 和 PHP-FPM 的组合,我想将 PHP 级别的最大执行时间设置为与 Nginx 上的相同。所以我添加了

max_execution_time=30
但它不起作用。 如果我使用这样的逻辑创建一个端点:

     foreach (range(1, 50) as $i) {
            sleep(1);
            if ($i > 40) {
                $this->logger->error('Processing request', ['i' => $i]);
                continue;
            }

            if ($i > 20) {
                $this->logger->warning('Processing request', ['i' => $i]);
                continue;
            }

            $this->logger->info('Processing request', ['i' => $i]);
        }

        $this->logger->info('Request processed');

30 秒后运行该脚本,我看到来自 Nginx 的 504,但 PHP 仍在处理请求并写入日志。我做错了什么?

更新:

sleep
这只是一个例子,在长时间运行的端点的生产中,我也看到同样的问题,当Nginx已经中断执行但PHP仍在处理,执行一些查询或其他东西时,我不想要PHP如果不应该忙的话...我知道可以通过
request_terminate_timeout
在 FPM 端处理,它将 SIGTERM 进程,但在这种情况下,出现与 PHP 工作人员相关的新问题会重新出现,从而导致增加504 的数量甚至根本无法达到 PHP,要解决这个问题,您需要增加 PHP 子进程的数量,但我不想这样做。

php nginx fpm
1个回答
0
投票

确保 Nginx 的 proxy_read_timeout (或 fastcgi_read_timeout)设置为匹配或超过您所需的 PHP 最大执行时间。例如,如果您希望 PHP 脚本最多运行 30 秒,请将 Nginx 的超时设置为 35 秒(proxy_read_timeout 35s;)。这为 PHP-FPM 提供了足够的时间来完成其工作,即使需要整整 30 秒。

location ~ \.php$ {
    include fastcgi_params;
    fastcgi_pass unix:/var/run/php/php7.4-fpm.sock;
    fastcgi_read_timeout 35s;  # Adjust timeout accordingly
}

将 Nginx 的 proxy_read_timeout (或 fastcgi_read_timeout)设置为适应 PHP 的 max_execution_time 加上一些缓冲区的值。 确保您的 PHP 脚本经过优化,可以优雅地处理超时并有效地管理长时间运行的任务。

© www.soinside.com 2019 - 2024. All rights reserved.