13

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

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

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

FastCGI:与服务器“/usr/local/php-5.6.24/sbin/php5-fpm”的通信中止:空闲超时(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>
4

2 回答 2

28

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

您看到的错误来自 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 代理 -> php-fpm 池服务器 -> php 进程

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

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

于 2017-01-03T22:08:22.620 回答
11

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

于 2018-02-19T19:59:37.213 回答