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