pcntlを使ってfork
昨日のPHP勉強会後の懇親会でid:koyhogeさんが「pcntl最高!」と言いながら(?)話していた内容がエントリされてます。バッチ処理でガシガシ使えそうです :-)
コードを見てみると、
本日はノッキングオンさんで第22回PHP勉強会が開催されたので参加してきました。その後の宴会で、PHPをCLIで使うときにexec()関数ではなくpcntl extensionを使って子プロセスを制御する話をしたら、周りの人の食いつきがいつになく良かったので、このネタでエントリを書くことにします。
<?php : $pid = pcntl_fork(); if ($pid == -1) { die('fork failed'); } else if ($pid) { // parent process ++$nchild; ++$cur_idx; } else { // child process : ?>
あれ?どっかで見たことのある。。。っちゅーか、Cでforkするときと同じ?ん?pctrl拡張のソースはどうなってる?ということで、見てみました(ext/pcntl/pcntl.c)。
/* {{{ proto int pcntl_fork(void) Forks the currently running process following the same behavior as the UNIX fork() system call*/ PHP_FUNCTION(pcntl_fork) { pid_t id; id = fork(); if (id == -1) { php_error_docref(NULL TSRMLS_CC, E_ERROR, "Error %d", errno); } RETURN_LONG((long) id); } /* }}} */
やっぱ、fork(2)のラッパーだ。そうかそうか。へぇ〜。