PHP PCNTL - 保持终端中的控制


PHP PCNTL - Maintain control in terminal

我想运行并行进程来同时处理至少 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

当前发生的情况是在显示 parent1 4 次脚本上的控件后丢失,并启动一个新的空命令行。再等待 5 秒后,剩余的输出出现。

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

编辑

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

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

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

dr 我有一个示例分叉包装器坐在我的博客 http://codehackit.blogspot.be/2012/01/childpids-break-pcntlsignaldispatch.html

如果要以自定义方式对 CTRL-C 进行

反应,则需要使用 pcntl_signal 为 CTRL-C(等于 SIGINT,值为 2)设置信号处理程序。