//同時に起動する子プロセスの最大数(default)
define('MAX_PROCESS_NUM', 3);
//子プロセスを強制終了するまでの秒数(default)
/** @var Array 子プロセスで実行される関数の引数 */
/** @var Integer 同時に起動する子プロセスの最大数 */
* 子プロセスで実行されるコールバックを設定する。
public function setWork($callback)
* @param Integer $maxProcessNum 同時に起動する子プロセスの最大数
public function __construct($args, $maxProcessNum = MAX_PROCESS_NUM)
$this->maxProcessNum = $maxProcessNum;
pcntl_signal(SIGTERM, array($this, 'sigHandler'));
pcntl_signal(SIGHUP, array($this, 'sigHandler'));
pcntl_signal(SIGUSR1, array($this, 'sigHandler'));
pcntl_signal(SIGALRM, array($this, 'sigHandler'));
$this->work = array($this, 'doWork');
* @param Integer $signo シグナル
private function sigHandler($signo)
echo "SIGUSER($signo)\n";
echo "Other signal: " . $signo . "\n";
private function doWork($args)
echo time()." : do work for args($args). do nothing but sleep $sec sec.\n";
echo time()." : do work for args($args). finished.\n";
$pchild = 0; //現在起動している子プロセス数
if(count($this->args) <= $pend) //終了判定
if( $pchild < $this->maxProcessNum &&
$pnum < count($this->args) ) //最大起動数を越えない場合
if ($pid == -1) //エラー発生時(子プロセスのforkに失敗した場合)
throw new Exception('Failed forc process.');
$arg = $this->args[$pnum];
if (!is_array($this->work)) //外部クロージャが設定されている場合
else //デフォルト処理を実行、または外部インスタンスのメソッドを実行( $mp->setWork(array($obj,"obj_function")); )
$pid = pcntl_waitpid(-1, $status, WUNTRACED);
* MultiProcess内部で実行されるメソッド。
echo "hello $arg! now that you can execute external object's function! \n";
"101", "102", "103", "104", "105", "106", "107"
echo " default doWork.\n";
$mp = new MultiProcess($args);
echo "\n using Closure.\n";
echo "external function.\n";
//別オブジェクトのメソッドを設定してdoWorkを実行
echo "\n using external function.\n";
$mp->setWork(array($ext, "hello"));