idimsh / parallel-processes
Run multiple Symfony CLI processes in parallel.
Requires
- php: >7.1
- clue/utf8-react: ^1
- psr/log: ^1
- react/event-loop: ^1
- symfony/process: ~3
Requires (Dev)
- idimsh/phpunit-tests: dev-master
- markrogoyski/simplelog-php: 0.*
- phpunit/phpunit: >=7.0
- squizlabs/php_codesniffer: ^3.0
README
##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.