增加PHP-FPM空闲超时设置

Increase PHP-FPM idle timeout setting

我们最近迁移到了 PHP-FPM。然而,我们遇到了一些长 运行ning 脚本的问题。代码大致如下:

foreach ($items as $item) {
     set_time_limit(30);
     proccessThatTakesAround2secs(); 
}

正常的PHP脚本时间限制也是30秒。这以前工作正常,因为我们将每个项目的剩余时间限制重新设置为 30 秒。大约有 1000 个项目,这意味着整个脚本通常需要大约 30 分钟才能完成。然而,我们后来遇到了以下问题:

FastCGI: comm with server "/usr/local/php-5.6.24/sbin/php5-fpm" aborted: idle timeout (30 sec)

现在我的问题是,将空闲超时增加到大约一个小时是否明智,但仍然确保 PHP 脚本不会 运行 超过 30 秒,除非我们使用set_time_limit?有没有办法在每个脚本的基础上设置空闲超时(类似于 set_time_limit?)

这是我们的池配置:

[www]
user = www-data
group = www-data
listen = /var/run/php5-fpm.sock
listen.owner = www-data
listen.group = www-data
pm = static
pm.max_children = 55
pm.max_requests = 10000

php_value[memory_limit] = 128M
php_value[max_execution_time] = 30
php_value[upload_max_filesize] = 20M
php_value[post_max_size] = 20M
php_value[max_input_vars] = 9999

这是我们的 fastcgi.conf

<IfModule mod_fastcgi.c>
    AddType application/x-httpd-fastphp5 .php
    Action application/x-httpd-fastphp5 /php5-fcgi
    Alias /php5-fcgi /usr/local/php-5.6.24/sbin/php5-fpm
    FastCgiExternalServer /usr/local/php-5.6.24/sbin/php5-fpm -socket /var/run/php5-fpm.sock -idle-timeout 30 -pass-header Authorization
    <Directory /usr/local/php-5.6.24/sbin/>
        Require all granted
   </Directory>
</IfModule>

从 mod_php 迁移时,我发现自己处于类似情况,长 运行ning 进程和 php-fpm 和 fastcgi。

您看到的错误来自 apache 的 fastcgi 代理,它终止了与 php-fpm 池的连接,因为您的脚本在 30 秒内没有输出任何内容。

您可以在您的 apache 配置中更改空闲超时以延长它(不能为 0):

FastCgiExternalServer /usr/lib/cgi-bin/php7-fcgi -socket /run/php/php7.0-fpm.sock -idle-timeout 1800 -pass-header Authorization

链是这样的:Apache -> FastCgiExternalServer 代理 -> php-fpm 池服务器 -> php 进程

Apache 代理终止与 php 的连接,因此从 php 设置 max_execution_time 或 set_time_limit 无关紧要。

AFAIK 如果 php 通过 mod_fastcgi 在 Apache 上 运行,则无法通过 php 代码设置每个脚本的时间限制或 .user.ini 或通过 apache (.htaccess)。因此,这意味着通过在一个地方扩展它,您可以延长超时时间。您的前端和后端用户。或者,您可以通过 2 个虚拟主机将其分开并在那里定义不同的超时值。

虽然这不一定适合 OP 的配置,但大多数人会 运行 PHP-FPM 在代理设置下。因此,您可以像这样设置代理设置的超时时间(这是我的php.conf

<Proxy "fcgi://127.0.0.1:9000">
   ProxySet timeout=300
</Proxy>

<FilesMatch \.php$>
    SetHandler application/x-httpd-php
    SetHandler "proxy:fcgi://127.0.0.1:9000"
</FilesMatch>

如果您使用的是 .sock 文件,只需将 fcgi://127.0.0.1:9000 的两个实例替换为使用 sock 文件的命令