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。
我有一个 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。