php - 增加 PHP-FPM 空闲超时设置

标签 php apache mod-fastcgi

我们最近迁移到了 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 sec)

现在我的问题是,除非我们使用 set_time_limit,否则将空闲超时增加到大约一个小时但仍然确保 PHP 脚本的运行时间不超过 30 秒是否明智?有没有办法在每个脚本的基础上设置空闲超时(类似于 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 迁移时,我发现自己在长时间运行的进程以及 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 个虚拟主机将其分开并在那里定义不同的超时值。

关于php - 增加 PHP-FPM 空闲超时设置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40360922/

相关文章:

asp.net - 从公共(public)访问中保护 MediaWiki 在 Linux PHP 上验证 Windows ASP 服务器

mysql - Hue 管理程序启动错误 - $HADOOP_CLASSPATH

轨道上的 ruby 。调度.fcgi 。 dependencies.rb :251:in `require' : cannot load such file -- fcgi (LoadError)

c - FastCGI 脚本在 Apache 2.4.6 和 mod_fastcgi 中找不到 libfcgi.so.0

php - 特定优惠券的 Woocommerce 总销售额

php - 如何在php中将文件从数据库保存到服务器

javascript - 从js脚本发送数据到当前的php文件

php - Facebook 如何通知并立即显示新评论,或者 Stackoverflow 是如何做到的?

apache - 为 Apache 中的不同位置设置 TimeOut 指令

perl - mod_perl 与 mod_fastcgi