1

我想使用Symfony2 Process创建一个具有多个工作子进程的进程。

基本上我有一个骨架可执行PHP脚本,如下所示

#!/usr/bin/env php
<?php

include "vendor/autoload.php";
$maxChild = 5;
$sleep = 1;
$child = 0;
while(true){
    if ($child < $maxChild){
        $random = rand(3, 9);
        $date = date('YmdHis');
        $process = new \Symfony\Component\Process\Process(<<<CMD
                sleep {$random} && \
                touch /tmp/foo-{$child}-{$random}-{$date}-`date +%Y%m%d%H%M%S` && \
                echo 'foo'
CMD
        );

    }
    sleep($sleep);
}

问题是如何在童工完成后立即生成新的童工。

据我所知,Process::start()是异步运行进程的方式。

所以如果我运行这个

 #!/usr/bin/env php
<?php

include "vendor/autoload.php";
$maxChild = 5;
$sleep = 1;
$child = 0;
while(true){
    if ($child < $maxChild){
        $random = rand(3, 9);
        $date = date('YmdHis');
        $process = new \Symfony\Component\Process\Process(<<<CMD
                sleep {$random} && \
                touch /tmp/foo-{$child}-{$random}-{$date}-`date +%Y%m%d%H%M%S` && \
                echo 'foo'
CMD
        );

        $process->start(function($type, $output) use (&$child){
            echo "{$output}\n";
            $child--;
        });
        $pid = $process->getPid();
        echo "Spawning #{$child}. pid: {$pid}. random: {$random}\n";
        $child++;

    }
    sleep($sleep);
}

子进程将异步运行,因为我看到了这个

$ ls --full-time /tmp/ | grep foo
-rw-rw-r-- 1 petra   petra        0 2014-01-29 15:47:52.208715691 +0700 foo-0-5-20140129154747-20140129154752
-rw-rw-r-- 1 petra   petra        0 2014-01-29 15:47:53.208715735 +0700 foo-1-5-20140129154748-20140129154753
-rw-rw-r-- 1 petra   petra        0 2014-01-29 15:47:58.212715939 +0700 foo-2-9-20140129154749-20140129154758
-rw-rw-r-- 1 petra   petra        0 2014-01-29 15:47:53.212715734 +0700 foo-3-3-20140129154750-20140129154753
-rw-rw-r-- 1 petra   petra        0 2014-01-29 15:47:59.216715981 +0700 foo-4-8-20140129154751-20140129154759

例如,文件foo-4-8-20140129154751-20140129154759是围绕生成的随机时间创建的,即 8 秒。

但是,我可以知道哪个进程正在结束的唯一方法是使用Process::wait(),但这会阻止整个进程。因此,当主循环被阻塞等待子进程完成时,另一个子进程可能会提前结束。

我最初想使用php file.php命令从内部循环执行另一个 PHP 文件,因为大多数业务逻辑都在同一个代码库中。所以首先尝试使用 PHP 是我的第一直觉。

所以我的问题是

  1. 有没有办法在子进程在最大子数内结束但不使用 Symfony2 进程阻塞后不久产生一个新的子进程?
  2. 或者是否有一个成熟的 PHP 库可以做到这一点(不是框架,虽然我已经使用了一个框架,最好是 PHP 5.3+ 库)?
  3. 如果我不能使用 PHP 做到这一点,是否有另一种方法可以使用 Python 或 PERL 做到这一点?我有点需要一个简单的单文件脚本解决方案。或者也许我可以使用一些需要小配置和更少编码的软件(最好可以安装在 Linux 中)?

更新

我刚刚了解了supervisor。我希望这适合我的需要。所以我在想而不是创建一个 PHP 脚本来生成子进程,也许我可以使用无限循环制作一个脚本并生成一个阻塞子进程,然后设置主管运行几个脚本。但是出于好奇,如果有人可以回答上述问题,那就太好了。

4

0 回答 0