その利点は、作業を簡単に「並列化」できることです。
すべての「結果」でpcntl_fork()を使用します。
(Linuxでのみテスト済み)
アイデアの本質:
class some_script extends CliScript
{
protected function processWorker ( $item )
{
$this -> log ( "I'm doing heavy job" );
sleep ( rand ( 1 , 5 ));
$this -> log ( "I'm done doing heavy job" );
}
}
$script = new some_script();
$script -> setWorkers ( 5 );
$script -> run ();
その結果、1つの親プロセスと5人の子供に「重い仕事」をさせます。
いくつかの微妙な違いと制限があります。データベースとファイルへのオープン接続が追加される可能性があります。
別のアプローチが必要です。親プロセスはベースを処理する必要があり、子プロセスは「汚れた作業」を実行して結果を返します。 以下に例を示します。
class master_and_workers extends CliScript
{
protected $contracts = array ( 2 , 4 , 5 , 1 , 3 , 7 , 3 , 1 , 4 , 9 , 2 , 4 , 1 );
protected $results ;
protected function processMaster ()
{
foreach ( $this -> contracts as $contract )
{
while ( ! $this -> canStartWorker () ) { sleep ( 1 ); };
$this -> startWorker ( $contract );
}
$this -> waitForChildren ();
var_export ( $this -> results );
}
protected function processWorker ( $item )
{
$this -> log ( "I'm busy for { $item } seconds..." );
sleep ( $item );
$this -> log ( "Job is done." );
return "Job is done. Sleep time was { $item } " ;
}
protected function processResult ( $result )
{
$this -> results [] = $result ;
}
}
$script = new master_and_workers();
$script -> setWorkers ( 3 );
$script -> run ();
混乱している場合の簡単な説明:
開始後、親プロセスでprocessMaster()メソッドが実行され、子プロセスが開始されます。
子プロセスはprocessWorker()メソッドを実行します。
子プロセスが返すことは一時ファイルに保存され、完了後、親のprocessResult()メソッドが呼び出され、結果がそこに渡されます。
CliScriptクラスにはいくつかの便利なメソッドがあります。
getRunningTime()は、開始からの実行時間を秒単位で返します
countWorkers()は、子プロセスの数を返します(親プロセスでのみ意味があります)
log()CliScript :: file file_logファイルが指定されている場合は、ログを記録し、そうでない場合は画面に記録します。 誰が報告するかに関する情報を表示します。
会社全体を「丁寧に」殺すために、SIGTERMシグナルを親プロセスに送信するために、プリミティブハンドラーがあります。
結論として。
コードが実行されてなめられているとは言えませんが、逆のことですが、必要に応じてCPUに作業をすばやくロードするのに役立ちます。
CliScriptクラスのソース
誰かが同様の開発をしていて、共有する準備ができているなら、私はとても幸せです。