PHP pcntl_wait() 不等待子进程退出

PHP pcntl_wait() does not wait for child exit

我有一个 php 脚本,它分叉和父调用 pnctl_wait()。根据 php 手册,pcntl_wait() 应该暂停当前进程的执行,直到子进程退出。但这不会发生。 父进程根本不等待,立即执行下一行。

我已尝试在下面的小示例脚本中重现该问题

<?php
$parentpid=getmypid();
declare(ticks=1);
$apid = pcntl_fork();
if ($apid == -1) {
  die('could not fork for client '.$client);
 } else if ($apid) {     //parent                                                                                                              


pcntl_wait($status,WNOHANG); //Protect against Zombie children                                                                     
/* Parent does not wait here */ 

  print "PARENT $parentpid has forked $apid \n";   

  sleep(100);
 } else { // child                                                                                                                             
  $pid = getmypid();
  print "CHILD $pid  is sleeping\n";
  sleep(40);
 }


?>

您不需要此处的 WNOHANG 选项。只需使用:

pcntl_wait($status);

如果你通过WNOHANG pcntl_wait() 将不会等待children 到return。它只报告 已经终止 .

的孩子

整个示例应如下所示:

$parentpid = getmypid();
$apid = pcntl_fork();

if ($apid == -1) {
  die('could not fork for client '.$client);
} else if ($apid) {
    // Parent process
    print "PARENT $parentpid has forked $apid \n";

    // Wait for children to return. Otherwise they 
    // would turn into "Zombie" processes
    pcntl_wait($status);
} else {
  // Child process
  $pid = getmypid();
  print "CHILD $pid  is sleeping\n";
  sleep(40);
}

注意,php 函数中的 pcntl 在 apache 服务器上不起作用 运行,因此 PHP 不像其他语言那样支持子进程,例如 C++ 中的 fork。