Open diffnest opened 6 years ago
主要用到2个函数,pcntl_fork, pcntl_wait;
pcntl_fork: 一次调用两次返回,在父进程中返回子进程pid; 在子进程中返回0,出错返回-1。
pcntl_wait ( int &$status [, int $options ] ): 阻塞当前进程,直到任意一个子进程退出或收到一个结束当前进程的信号,注意是结束当前进程的信号,子进程结束发送的SIGCHLD不算。使用$status返回子进程的状态码,并可以指定第二个参数来说明是否以阻塞状态调用;
阻塞方式调用的,函数返回值为子进程的pid,如果没有子进程返回值为-1; 非阻塞方式调用,函数还可以在有子进程在运行但没有结束的子进程时返回0。 目的:父进程必须等待一个子进程退出后,再创建下一个子进程。
DEMO:
function transfer($class, $method = 'run', $opt) { $className = ucfirst($class); $instance = new $className(); $instance->$method($opt); return true; } function runProcess($func, $class, $method, $opt = array(), $pNum = 1) { while (true) { $pid = pcntl_fork(); if ($pid == -1) { exit("could not fork" . posix_getpid() . "\n"); } if ($pid) { static $executeNum = 0; $executeNum ++; if ($executeNum >= $pNum) { pcntl_wait($status); $executeNum --; } } else { $this->$func($class, $method, $opt); sleep(1); exit(0); } } } runProcess("transfer", $class, $method, $opt, 8);
pcntl_fork: 一次调用两次返回,在父进程中返回子进程pid; 在子进程中返回0,出错返回-1。
pcntl_wait ( int &$status [, int $options ] ): 阻塞当前进程,直到任意一个子进程退出或收到一个结束当前进程的信号,注意是结束当前进程的信号,子进程结束发送的SIGCHLD不算。使用$status返回子进程的状态码,并可以指定第二个参数来说明是否以阻塞状态调用;
DEMO: