使用Symfony2 Process管理多个PHP worker子进程

时间:2014-01-29 09:12:12

标签: php symfony symfony-process

我想使用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中)?
  4. 更新

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

0 个答案:

没有答案