0

我想运行并行进程来同时处理至少 4 个用户。

ob_end_flush();

for($i = 0; $i < 4; $i++)
{
   $pid=pcntl_fork();
   if ($pid == -1) {
      echo("Could not create a new child.");
      exit;
   } else if ($pid == 0) {
      //This will get excuted only in the child process
      echo 'parent1';
      sleep(5);
      echo 'parent2';
     exit;
   }
}

输出是这样的:

> php testscript.php
parent1
parent1
parent1
parent1
> parent2
parent2
parent2
parent2

当前发生的情况是在显示parent14 次后,对脚本的控制丢失,并启动了一个新的空命令行。再等 5 秒后,剩余的输出来了。

我怎样才能避免这种情况发生。我希望能够在我想要的时候打破脚本。

编辑

如果我通过终端发送信号,比如说按 CTRL+C,脚本不会停止,需要一种方法来通知脚本在那一刻停止。

4

2 回答 2

1

您正在创建肮脏的僵尸/无父进程,这些进程被其他当然也不想要它们的人采用 =)

当您使用分叉时,您需要了解您正在创建当前进程(堆栈/堆和所有)的副本,为其提供一个新的进程 ID(PID)并将其父 ID(PPID)设置为自己的说产生的过程是一个孩子。在这里,这 4 个新孩子的父母完成了他所有明显的工作,然后没有任何错误地死去,因为他无事可做。但是作为任何尊重的父母应该做的,你的父母过程应该坐下来照顾他的孩子。这就是信号变得有用的地方,尤其是 SIGCHLD 信号,它将被发送到任何子进程刚刚过去的父进程。结合一个小的事件处理循环,你的父母可以优雅地管理他的孩子 \o/

tl;博士我的博客中有一个示例 fork 包装器http://codehackit.blogspot.be/2012/01/childpids-break-pcntlsignaldispatch.html

于 2012-06-10T17:41:28.570 回答
0

如果您想以自定义方式对其做出反应,则需要使用pcntl_signal为 CTRL-C(等于SIGINT,值为 2)设置信号处理程序。

于 2012-06-10T14:52:57.230 回答