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