Do You PHP はてブロ

Do You PHPはてなからはてブロに移動しました

pcntlを使ってfork


昨日のPHP勉強会後の懇親会でid:koyhogeさんが「pcntl最高!」と言いながら(?)話していた内容がエントリされてます。バッチ処理でガシガシ使えそうです :-)


本日はノッキングオンさんで第22回PHP勉強会が開催されたので参加してきました。

その後の宴会で、PHPCLIで使うときに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)のラッパーだ。そうかそうか。へぇ〜。