idimsh/parallel-processes

并行运行多个 Symfony CLI 进程。

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

This package is auto-updated.

Last update: 2024-09-22 18:28:09 UTC


README

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

##仍在进行中 ...

安装

推荐通过 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-found
  • grep --color -rHn \'random string not there\' /usr /var/

将同时运行,并且都会失败,长时间运行的 grep 将会继续运行,尽管 ls 已经失败。由于输出已委托给日志接口和回调,因此没有任何输出。

鸣谢

许可证

在 MIT 许可证下发布 - 请参阅 许可证文件 了解详细信息。