bluepsyduck / symfony-process-manager
Symfony进程管理器,能够并行运行多个进程。
1.3.3
2021-12-03 21:30 UTC
Requires
- php: ^7.2 || ^8.0
- symfony/process: ^3.0 || ^4.0 || ^5.0 || ^6.0
Requires (Dev)
- bluepsyduck/test-helper: ^1.0
- phpstan/phpstan: ^1.0
- phpstan/phpstan-phpunit: ^1.0
- phpstan/phpstan-strict-rules: ^1.0
- phpunit/phpunit: ^8.0 || ^9.0
- rregeer/phpunit-coverage-check: ^0.3
- squizlabs/php_codesniffer: ^3.3
README
此包提供了一个简单的进程管理器类,可以执行多个进程,并指定并行进程的限制。该类期望进程使用Symfony Process组件。
用法
进程管理器的使用方法简单明了,以下是一个示例。
<?php use BluePsyduck\SymfonyProcessManager\ProcessManager; use Symfony\Component\Process\Process; $numberOfParallelProcesses = 4; // The number of processes to execute in parallel. $pollInterval = 100; // The interval to use for polling the processes, in milliseconds. $processStartDelay = 0; // The time to delay the start of processes to space them out, in milliseconds. $processManager = new ProcessManager($numberOfParallelProcesses, $pollInterval, $processStartDelay); // Add some processes // Processes get executed automatically once they are added to the manager. // If the limit of parallel processes is reached, they are placed in a queue and wait for a process to finish. $processManager->addProcess(Process::fromShellCommandline('ls -l')); $processManager->addProcess(Process::fromShellCommandline('ls -l')); // Wait for all processes to finish $processManager->waitForAllProcesses();
回调函数
进程管理器允许指定一些回调函数,这些函数会根据进程的状态被调用。
- processStartCallback: 在进程启动之前触发。
- processFinishCallback: 当进程完成时触发。
- processTimeoutCallback: 当进程超时时触发。注意,之后还会触发processFinishCallback。
- processCheckCallback: 每当检查进程是否完成时触发。注意,此回调函数会定期调用,但在
processStartCallback
和processFinishCallback
或processTimeoutCallback
之间至少调用一次。
每个回调函数都接收一个触发事件的进程实例作为唯一参数。以下是一个设置processStartCallback
的示例。
<?php use BluePsyduck\SymfonyProcessManager\ProcessManager; use Symfony\Component\Process\Process; $processManager = new ProcessManager(); $processManager->setProcessStartCallback(function (Process $process): void { echo 'Starting process: ' . $process->getCommandLine(); }); $processManager->addProcess(Process::fromShellCommandline('ls -l')); $processManager->waitForAllProcesses();