pcntl_forkのメモ

覚え書き

<?php
$pid = pcntl_fork();
//fork失敗
if( $pid == -1 ){ return false; }
//子プロセスハンドラ
if( $pid == 0 )
{
    //timeout設定
    pcntl_alarm( $this->_timeout );
    //親スレッドからはpid=0で渡されるので自分自身のpidは以下で取得
    $mypid = getmypid();

    /**
      * なんらかの処理を書く
      * 親スレッドへメッセージは送れないので、
      * 共有メモリやストレージにpid付きで保存等工夫
      * 
      * loop内で複数回pcntl_forkする場合、
      * exitしないと、fork先でもpcntl_forkが呼ばれてしまう可能性がある
      */
    exit();
}
//親プロセスハンドラ
//子プロセスが終了するまで待機
//-1:すべての子プロセス終了
pcntl_waitpid( -1, $status, WUNTRACED ) ] 

pcntl_waitpidの引数は
-1:全ての子プロセスを待ちます。これは、wait 関数の動作と同じです。
0:プロセスグループ ID がコール側のプロセスと等しい子プロセスを 待ちます。
>0:プロセス ID が pid の値に等しい 子プロセスを待ちます。
WNOHANG:子プロセスが終了していない場合に直ちに処理を返します。
WUNTRACED:停止した子プロセスの場合に処理を返します。そして、ステータス は報告されません。

うまく動作しない場合はpcntl_waitpid()でpidの状態をデバッグしよう。