説明
FCGI :: ProcManagerの小さな拡張で、fcgiプロセスマネージャーにアクセスできます。 サードパーティのプログラムとマネージャーとの通信には、ソケットが使用されます。
落とし穴
FCGI :: ProcManagerモジュールは、着信要求ハンドラーを生成するために使用されます。 現在のプロセスはマネージャーです。 最初からハンドラー(n_processes個)を生成し、戦闘中の死者を監視することでその数を維持します。 これらの目的のために、
waitを使用します。 これが問題のある場所です。 スレッドが開始されると、マネージャーはwaitを呼び出してブロックされます。 あなたは
信号を介してのみそれに到達することができ
ます 。 シグナルハンドラーでコードを賢明かつ正確に実行する必要があります。govnokodを駆動するのは良くありません。 そのため、別の通信チャネルを確立する必要があります。
実装
たとえば、マネージャーにソケットをリッスンさせてみましょう。 これを行うには、マネージャーにブロックしないように強制する必要があります。 pm_wait関数は、FCGI :: ProcManagerで待機します。
sub pm_wait { my ($this) = self_or_default(@_);
wait呼び出しを
waitpidに置き換えて、コードを貼り付ける必要があります。 マネージャーは別のポートを開いてリッスンする必要があり、スタンバイモードでは定期的に子孫を見てポートをリッスンする必要があります。 pm_wait関数のバージョンを作成し、FCGI :: ProcManagerモジュールの同じ名前の関数を
モンキーパッチに置き換えます。 メッセージへの応答として、プロジェクトライブラリを更新した後、すべての子孫をオーバーロードします。
use FCGI; use FCGI::ProcManager; use IO::Select; use IO::Socket; use POSIX ":sys_wait_h";
テストのコードは次のとおりです。
use IO::Socket; use feature ':5.14'; use strict; my $socket = new IO::Socket::INET(Proto => "tcp", Type => SOCK_STREAM, PeerPort => 9034, PeerAddr => "127.0.0.1" ) or die "Can't connect: $!";
合計
したがって、fastcgiプロセスマネージャにメッセージを送信できます(プロトコルは自分で作成できます)。 これは、アプリケーションの現在の構成を照会するために使用できます。 プロジェクトライブラリをリロードします(この例ではコメントアウトされています)。 ハンドラーの数を増減できます
$pm->{n_processes} = 10; $pm->sig_manager('HUP');
さて、プロファイリングのオン/オフなどのささいなこと。 もちろん、これらのタスクは他の方法で解決できます。
それを行うには複数の方法があります