web-dev-qa-db-ja.com

PHP-FPMアイドルタイムアウト設定を増やす

最近、PHP-FPMに移行しました。ただし、長時間実行されるスクリプトで問題が発生しました。コードは大体次のようになります。

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

通常のPHPスクリプトの制限時間も30秒です。これは、各アイテムの残りの制限時間を30秒にリセットするという点で以前はうまく機能していました。合計は完了するまで通常約30分かかりますが、その後、次の問題に到達しました。

FastCGI:サーバー "/usr/local/php-5.6.24/sbin/php5-fpm"との通信が中断されました:アイドルタイムアウト(30秒)

私の質問は、アイドルタイムアウトを1時間程度に増やしても、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>
9
apokryfos

Mod_phpから移行した場合、実行時間の長いプロセスとphp-fpmおよびfastcgiで同様の状況にあることがわかりました。

表示されているエラーは、スクリプトが30秒間何も出力しなかったため、php-fpmプールへの接続を強制終了したApacheのfastcgiプロキシからのものです。

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への接続を強制終了するため、phpからmax_execution_timeまたはset_time_limitを設定することは重要ではありません。

AFAIK phpがmod_fastcgiを介してApacheで実行されている場合、phpコードまたは.user.iniまたはApache(.htaccess)からスクリプトごとに時間制限を設定する方法はありません。つまり、1か所で拡張することにより、たとえばフロントエンドとバックエンドの両方のユーザー。あるいは、2つの仮想ホストを介して分離し、そこで異なるタイムアウト値を定義できます。

23
seven

これは必ずしも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ファイルを使用するコマンドに置き換えてください。

7
Machavity