2016-11-01 12 views
3

最近、PHP-FPMに移行しました。しかし、長時間実行されているスクリプトでは問題が発生しました。コードはおおよそ次のようになります。PHP-FPMのアイドルタイムアウト設定を増やす

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

通常のPHPスクリプトの制限時間も30秒です。以前は、残りの時間制限を各項目ごとに30秒に戻していたため、以前は問題なく機能していました。約1000項目があります。つまり、スクリプトの作成には通常、約30分かかります。

のFastCGI:サーバーとのCOMM "/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> 
です

答えて

10

mod_phpから移行したときに、長時間実行されているプロセスとphp-fpmとfastcgiを使って、自分の自己を見つけました。

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

あなたは(0にはできません)、それを拡張するために、あなたのApacheの設定でアイドルタイムアウトを変更することができます。

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

チェーンはこのように書きます:アパッチ - > FastCGIExternalServerのプロキシ - > PHP-FPMプールサーバー - > PHPプロセス

Apacheプロキシはphpへの接続を終了するので、max_execution_timeまたはset_time_limitをphpから設定することは問題になりません。

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

+0

mod_fastcgiに関するあなたのコメントに関しては、どこにでも時間制限を長くしてから、set_time_limit()を使用してアプリケーションの制限時間を短く設定することができます。 –

+0

@FrankForte afaik - この場合、サーバー設定がアプリケーション設定よりも優先されます。サーバーは接続を切断します。 – seven

+0

例:600秒のタイムアウト、30秒のアプリケーション設定、または300秒のタイムアウトに設定されたサーバー - アプリケーションのタイムアウトがサーバーより短い間は、アプリケーションのタイムアウトが最初にトリガーされると考えられますPHPが終了する前の最終的なクリーンアップ)。 –

1

これは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> 

あなたの代わりに、ちょうど靴下を使用するためのコマンドでfcgi://127.0.0.1:9000の両方のインスタンスを置き換える.sockファイルを使用している場合ファイル

関連する問題