I am trying to achieve a parallel execution of my workers and I'm using ReactPHP to help me. https://github.com/reactphp/react
But I'm not getting behaviour that I'm expecting to get.
Scenario:
I have three workers.
fetch.php
parse.php
notify.php
fetch.php and notify.php don't have prerequired conditions to run, so they can run in parallel and should run first.
parse.php needs to wait for fetch.php to finish with work and then it should execute.
So i have my parent script process.php where all the magic happens.
$tasks = ['fetch', 'notify'];
forkProcess($tasks);
function forkProcess($tasks)
{
if (empty($tasks)) return false;
$loop = React\EventLoop\Factory::create();
foreach ($tasks as $task) {
$process = new React\ChildProcess\Process("php $task.php");
$loop->addTimer(0.001, function($timer) use ($process, $task) {
$process->start($timer->getLoop());
$process->stdout->on('data', function($output) use ($task) {
echo $output;
$subTasks = getDependentTask($task);
forkProcess($subTasks);
});
});
}
$loop->run();
}
function getDependentTask($task)
{
if ($task != 'fetch') return [];
return [
'parse'
];
}
So instead of getting this output:
FETCH
NOTIFY
PARSE
I am getting
FETCH
PARSE
NOTIFY
And script waits for parsing to finish and then goes to the next task which is notify.
So I am doing something wrong and since I'm playing around with ReactPHP for the first time its probably some rookie mistake.
Is the problem that I'm using recursion and that is blocking the loop or something else.
Maybe loop was not implemented to solve this kind of problems that I'm trying to solve?