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の状態をデバッグしよう。