增加PHP-FPM空闲超时设置


Increase PHP-FPM idle timeout setting

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

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秒)

现在我的问题是,它是明智的增加空闲超时像一个小时,但仍然确保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>

我发现自己在长时间运行的进程和php-fpm和fastcgi类似的情况下,从mod_php迁移。

你看到的错误是apache的fastcgi代理杀死了连接到php-fpm池,因为你的脚本没有输出任何东西30秒。

您可以在apache配置中更改idle-timeout以扩展它(不能为0):

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

链接如下:Apache -> FastCgiExternalServer proxy -> php-fpm pool server -> php process

Apache代理会断开与php的连接,所以设置max_execution_time或set_time_limit从php无关。

AFAIK 如果php通过mod_fastcgi在Apache上运行,则没有办法从php代码或.user.ini或通过Apache (.htaccess)设置每个脚本的时间限制。这意味着,在一个地方扩展它,你就延长了超时时间。前端和后端用户。或者,你可以通过两个vhost分隔它,并在那里定义不同的超时值。

虽然这并不一定适合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文件

的命令