【问题标题】:PHP PCNTL - Maintain control in terminalPHP PCNTL - 在终端中保持控制
【发布时间】:2012-06-08 10:29:56
【问题描述】:

我想运行并行进程以同时处理至少 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,脚本不会停止,需要一种方法来通知脚本在那个时刻停止。

【问题讨论】:

  • 您的“想要”的脑电波是如何转移到 PHP 脚本的?我不知道存在脑电波库。你能详细说明一下吗,看起来是一个非常酷的扩展,每个人都应该知道。
  • 修改了问题。要求是让php脚本监听终端睡眠后发送的信号。

标签: php terminal pcntl


【解决方案1】:

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

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

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

【讨论】:

  • 使用您在博客中的代码,每个进程都在等待前一个进程先完成。我的要求是独立于之前的孩子是否完成来运行这些进程。
  • 这根本不是真的。请发布您如何使用它的示例,可能存在客户端错误。
  • 是的,确实,这是我的实现中的一个错误,效果很好,谢谢
【解决方案2】:

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

【讨论】:

  • 试过了,但没有成功。在第四次显示 parent1 之后,会启动一个新的终端行,因此在此之后按 CTRL-C 不会向 PHP 脚本发送任何信号。
猜你喜欢
  • 1970-01-01
  • 2011-07-10
  • 2013-03-29
  • 2020-08-12
  • 2015-08-11
  • 2016-11-23
  • 1970-01-01
  • 2017-06-10
相关资源
最近更新 更多