Skip to content

札记之PHP多进程 #27

@diffnest

Description

@diffnest

主要用到2个函数,pcntl_fork, pcntl_wait;

  1. pcntl_fork:

      一次调用两次返回,在父进程中返回子进程pid;

      在子进程中返回0,出错返回-1。

  2. pcntl_wait ( int &$status [, int $options ] ):

       阻塞当前进程,直到任意一个子进程退出或收到一个结束当前进程的信号,注意是结束当前进程的信号,子进程结束发送的SIGCHLD不算。使用$status返回子进程的状态码,并可以指定第二个参数来说明是否以阻塞状态调用;

     阻塞方式调用的,函数返回值为子进程的pid,如果没有子进程返回值为-1;
     非阻塞方式调用,函数还可以在有子进程在运行但没有结束的子进程时返回0。
     目的:父进程必须等待一个子进程退出后,再创建下一个子进程。
    
  3. 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);

Metadata

Metadata

Assignees

No one assigned

    Labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions