idimsh/parallel-processes

Run multiple Symfony CLI processes in parallel.

v3.0.3 2021-08-22 12:03 UTC

This package is auto-updated.

Last update: 2024-04-22 17:41:03 UTC


README

Latest Version on Packagist Software License Build Status Coverage Status Quality Score Total Downloads

##Still in progress ...

Installation

The preferred method of installation is via Composer. Run the following command to install the latest version of a package and add it to your project's composer.json:

composer require idimsh/parallel-processes

Purpose

To be able to run multiple shell commands in parallel, leveraging Symfony Process those running in the background. And be able to cease execution (stop all the processes) in case one of them failed.

Design

This package uses an event loop, currently ReactPHP event-loop is chosen, but this might change.
The event loop helps in being able to start the processes one by one in non blocking manner, and allowing monitoring them for non-zero exit faster.

Usage

Symfony Process can be constructed using an array or a string.
If constructed using an array, then each item will be shell escaped before forming the command line to be executed.
If constructed using a string, then it is assumed to already be shell escaped.

The second way is preferred.

On linux, exiting a running processes by signaling it works as long as the process is started using exec, otherwise, it can't really be stopped.

The best way is to construct the commands to be executed.

Example 1, no special handing.

$loop              = \React\EventLoop\Factory::create();
$newProcessFactory = new \idimsh\ParallelProcesses\NewProcessFactory();
$processesConfig   = \idimsh\ParallelProcesses\BackgroundProcessesConfig::create();

$parallel    = new \idimsh\ParallelProcesses\ParallelCliProcesses(
    $processesConfig,
    $newProcessFactory,
    $loop
);
$parallel->execWithLoop([
    'failed ls'         => \idimsh\ParallelProcesses\Command\SimpleCommand::fromString(
      'exec /bin/bash -c "ls -la /tmp/not-found"'
    )->setAsShellEscaped(true),
    
   'long failed grep exec in bash'         => \idimsh\ParallelProcesses\Command\SimpleCommand::fromString(
      'exec /bin/bash -c "sleep 3; grep --color -rHn \'random string not there\' /usr /var/"'
    )->setAsShellEscaped(true),
]);
$loop->run();

The two commands:

  • ls -la /tmp/not-found
  • grep --color -rHn \'random string not there\' /usr /var/

Will both run in parallel, and will both fail, the long running grep will continue to run despite that ls has failed already. Nothing will be output, since output is delegated to a logger interface and to callbacks.

Credits

License

Released under MIT License - see the License File for details.