简体   繁体   English

增加PHP-FPM空闲超时设置

[英]Increase PHP-FPM idle timeout setting

We have recently migrated to PHP-FPM. 我们最近迁移到了PHP-FPM。 However we have encountered a problem with some long running scripts. 但是我们遇到了一些长时间运行的脚本的问题。 The code looks roughly like: 代码看起来大致如下:

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

The normal PHP script time limit is also 30 secs. 正常的PHP脚本时间限制也是30秒。 This was previously working fine in that we reset the remaining time limit back to 30 secs for each item. 之前工作正常,因为我们将每个项目的剩余时间限制重新设置为30秒。 There are around 1000 items meaning the script in total would normally take about 30 mins to complete. 大约有1000个项目,这意味着该脚本通常需要大约30分钟才能完成。 However we have since reached the following problem: 但是我们已经达到了以下问题:

FastCGI: comm with server "/usr/local/php-5.6.24/sbin/php5-fpm" aborted: idle timeout (30 sec) FastCGI:comm与服务器“/usr/local/php-5.6.24/sbin/php5-fpm”中止:空闲超时(30秒)

Now my question is, is it sensible to increase the idle timeout to something like an hour but still ensure the PHP scripts don't run for longer than 30 secs, unless we use set_time_limit ? 现在我的问题是,将空闲超时增加到一个小时是否明智但是仍然确保PHP脚本运行时间不超过30秒,除非我们使用set_time_limit Is there a way to set the idle timeout on a per script basis (something akin to a set_time_limit ?) 有没有办法在每个脚本的基础上设置空闲超时(类似于set_time_limit ?)

Here is our pool configuration: 这是我们的池配置:

[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

And here is our fastcgi.conf 这是我们的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>

I have found my self in similar situation with long running processes and php-fpm and fastcgi when migrated from mod_php. 当从mod_php迁移时,我发现我的自我处于类似的情况下,运行时长,php-fpm和fastcgi。

The error you are seeing is from apache's fastcgi proxy who killed connection to php-fpm pool because your script did not outputted anything for 30 seconds. 您看到的错误来自apache的fastcgi代理,该代理终止了与php-fpm池的连接,因为您的脚本在30秒内没有输出任何内容。

You can change idle-timeout in your apache config to extend it (cannot be 0): 您可以在apache配置中更改idle-timeout以扩展它(不能为0):

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

Chain goes like this: Apache -> FastCgiExternalServer proxy -> php-fpm pool server -> php process 链是这样的:Apache - > FastCgiExternalServer代理 - > php-fpm池服务器 - > php进程

Apache proxy kills connection to php, so setting max_execution_time or set_time_limit from php doesn't matter. Apache代理会终止与php的连接,因此从php设置max_execution_time或set_time_limit无关紧要。

AFAIK if php is being run on Apache via mod_fastcgi, there is no way to set per script time limits from php code or .user.ini or via apache (.htaccess) . AFAIK 如果通过mod_fastcgi在Apache上运行php,则无法通过php代码或.user.ini或通过apache(.htaccess)设置每个脚本时间限制 So that means that by extending it in one place you are extending timeout for eg. 这意味着通过在一个地方扩展它,你可以延长超时时间,例如。 both your frontend and backend users. 您的前端和后端用户。 Alternatively you could separate it via 2 vhosts and define different timeout values there. 或者,您可以通过2个虚拟主机分隔它,并在那里定义不同的超时值。

While this doesn't necessarily fit the OP's configuration, most people are going to be running PHP-FPM under a proxy setting. 虽然这不一定适合OP的配置,但大多数人将在代理设置下运行PHP-FPM。 As such, you can set the timeout for a proxy setup like so (this is my php.conf ) 因此,您可以像这样设置代理设置的超时(这是我的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>

If you're using a .sock file instead, just replace both instances of fcgi://127.0.0.1:9000 with the command to use the sock file 如果您使用的是.sock文件,只需将fcgi://127.0.0.1:9000两个实例替换为使用sock文件的命令

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM