idimsh / parallel-processes
并行运行多个 Symfony CLI 进程。
v3.0.3
2021-08-22 12:03 UTC
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
##仍在进行中 ...
安装
推荐通过 Composer 安装。运行以下命令以安装最新版本的包并将其添加到项目的 composer.json
composer require idimsh/parallel-processes
目的
能够并行运行多个 shell 命令,利用在后台运行的 Symfony Process,并在其中一个失败时停止执行(停止所有进程)。
设计
此包使用事件循环,目前选择 ReactPHP 事件循环,但可能会更改。
事件循环有助于能够以非阻塞方式逐个启动进程,并更快地监控它们的非零退出。
用法
可以使用数组或字符串构造 Symfony Process。
如果使用数组构造,则在形成要执行的命令行之前将对每个项目进行 shell 转义。
如果使用字符串构造,则假定它已经过 shell 转义。
第二种方式更受青睐。
在 Linux 上,通过信号退出正在运行的过程只要该过程是用 exec 启动的,否则实际上无法停止。
最佳方法是构建要执行的命令。
示例 1,没有特殊处理。
$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();
以下两个命令
ls -la /tmp/not-foundgrep --color -rHn \'random string not there\' /usr /var/
将同时运行,并且都会失败,长时间运行的 grep 将会继续运行,尽管 ls 已经失败。由于输出已委托给日志接口和回调,因此没有任何输出。
鸣谢
许可证
在 MIT 许可证下发布 - 请参阅 许可证文件 了解详细信息。