Symfony2 Processを使用して、複数のワーカー子プロセスを持つプロセスを作成したいと考えています。
基本的に、以下のようなスケルトン実行可能なPHPスクリプトがあります
#!/usr/bin/env php
<?php
include "vendor/autoload.php";
$maxChild = 5;
$sleep = 1;
$child = 0;
while(true){
if ($child < $maxChild){
$random = rand(3, 9);
$date = date('YmdHis');
$process = new \Symfony\Component\Process\Process(<<<CMD
sleep {$random} && \
touch /tmp/foo-{$child}-{$random}-{$date}-`date +%Y%m%d%H%M%S` && \
echo 'foo'
CMD
);
}
sleep($sleep);
}
問題は、子ワーカーが終了したらすぐに新しい子ワーカーを生成する方法です。
私の知る限りProcess::start()
、プロセスを非同期で実行する方法です。
だから私がこれを実行すると
#!/usr/bin/env php
<?php
include "vendor/autoload.php";
$maxChild = 5;
$sleep = 1;
$child = 0;
while(true){
if ($child < $maxChild){
$random = rand(3, 9);
$date = date('YmdHis');
$process = new \Symfony\Component\Process\Process(<<<CMD
sleep {$random} && \
touch /tmp/foo-{$child}-{$random}-{$date}-`date +%Y%m%d%H%M%S` && \
echo 'foo'
CMD
);
$process->start(function($type, $output) use (&$child){
echo "{$output}\n";
$child--;
});
$pid = $process->getPid();
echo "Spawning #{$child}. pid: {$pid}. random: {$random}\n";
$child++;
}
sleep($sleep);
}
これを見ると、子プロセスは非同期で実行されます
$ ls --full-time /tmp/ | grep foo
-rw-rw-r-- 1 petra petra 0 2014-01-29 15:47:52.208715691 +0700 foo-0-5-20140129154747-20140129154752
-rw-rw-r-- 1 petra petra 0 2014-01-29 15:47:53.208715735 +0700 foo-1-5-20140129154748-20140129154753
-rw-rw-r-- 1 petra petra 0 2014-01-29 15:47:58.212715939 +0700 foo-2-9-20140129154749-20140129154758
-rw-rw-r-- 1 petra petra 0 2014-01-29 15:47:53.212715734 +0700 foo-3-3-20140129154750-20140129154753
-rw-rw-r-- 1 petra petra 0 2014-01-29 15:47:59.216715981 +0700 foo-4-8-20140129154751-20140129154759
たとえばfoo-4-8-20140129154751-20140129154759
、生成されたランダム時間 (8 秒) の前後にファイルが作成されます。
しかし、どのプロセスが終了しているかを知る唯一の方法は、を使用するProcess::wait()
ことですが、それはプロセス全体をブロックします。そのため、子プロセスの終了を待ってメイン ループがブロックされると、別の子プロセスが早期に終了する可能性があります。
php file.php
ほとんどのビジネスロジックは同じコードベースにあるため、最初はコマンドを使用してループ内から別の PHP ファイルを実行したいと考えています。したがって、PHP を使用してこれを最初に試すことは、私の最初の直感です。
だから私の質問は
- 子プロセスが最大数の子の数内で終了した直後に新しい子プロセスを生成する方法はありますが、Symfony2 プロセスを使用してブロックすることはありませんか?
- または、これを行うための成熟したPHPライブラリがありますか(フレームワークではありませんが、私はすでにフレームワークを使用しており、できればPHP 5.3+ライブラリを使用しています)?
- PHPを使用してこれを行うことができない場合、おそらくPythonまたはPERLを使用してこれを行う別の方法はありますか? シンプルな 1 ファイル スクリプト ソリューションが必要です。それとも、構成が小さくコーディングが少ないソフトウェア (できれば Linux にインストール可能) を使用できますか?
アップデート
スーパーバイザーについて知りました。これが私のニーズに合っていることを願っています。したがって、子プロセスを生成する PHP スクリプトを作成する代わりに、無限ループを使用して 1 つのスクリプトを作成し、ブロックしている子プロセスを生成してから、いくつかのスクリプトを実行するようにスーパーバイザーを設定できると考えています。しかし、好奇心のために、誰かが上記の質問に答えてくれるとうれしいです.