mrden/forker

进程分叉器

0.2.0 2023-10-08 09:39 UTC

This package is auto-updated.

Last update: 2024-09-08 11:41:23 UTC


README

安装

composer require mrden/forker

分叉单个可调用进程

$context = 'any parent code context data';
$callable = new \Mrden\Fork\Process\CallableProcess(function () use ($context) {
    echo 'context from parent process ' . $context;
});
$forker = new \Mrden\Fork\Forker($callable);
$forker->run();
// any code in this parent process

在3个副本中分叉实现的单个进程

namespace Any;

class SingleProcess extends \Mrden\Fork\Contracts\Process
{
    use \Mrden\Fork\Traits\ProcessFileStorageTrait;

    public function execute(): void
    {
        $params = $this->getParams();
        echo 'context from parent process ' . ($params['context'] ?? '');
    }

    protected function prepare(): void
    {
    }
    
    protected function checkParams(): void
    {
    }
}

在代码中启动

$context = 'any parent code context data';
$singleProcess = new \Any\SingleProcess([
    'context' => $context
]);
$forker = new \Mrden\Fork\Forker($singleProcess);
$forker->run(3);
// any code in this parent process

通过 bin/forker 启动

php bin/forker --process="\Any\SingleProcess" --count=3 --process-context="任何上下文数据"

在3个副本中分叉单个守护进程

namespace Any;

class SingleDaemonProcess extends \Mrden\Fork\Contracts\DaemonProcess
{
    use \Mrden\Fork\Traits\ProcessFileStorageTrait;
    
    /**
     * in sec
     */
    protected $period = 5;
    
    protected function job(): void
    {
        echo 'I\'m the code of iteration daemon process';
    }
    
    protected function checkParams(): void
    {
    }

    protected function prepare(): void
    {
    }
}

在代码中启动

$singleProcess = new \Any\SingleDaemonProcess();
$forker = new \Mrden\Fork\Forker($singleProcess);
$forker->run(3);

通过 bin/forker 启动

php bin/forker --process="\Any\SingleDaemonProcess" --count=3

通过 bin/forker 停止

php bin/forker --process="\Any\SingleDaemonProcess" --stop=1

通过 bin/forker 仅停止2个副本

php bin/forker --process="\Any\SingleDaemonProcess" --stop=1 --count=2

通过 bin/forker 仅停止第2个副本

php bin/forker --process="\Any\SingleDaemonProcess" --stop=1 --clone_number=2

通过 bin/forker 重新启动所有副本

php bin/forker --process="\Any\SingleDaemonProcess" --restart=1

通过 bin/forker 仅重新启动2个副本

php bin/forker --process="\Any\SingleDaemonProcess" --restart=1 --count=2

通过 bin/forker 仅重新启动第2个副本

php bin/forker --process="\Any\SingleDaemonProcess" --restart=1 --clone_number=2

启动单个守护进程监视器

namespace Any;

class SingleDaemonWatcherProcess extends \Mrden\Fork\Contracts\DaemonWatcherProcess
{
    use \Mrden\Fork\Traits\ProcessFileStorageTrait;
    
    protected function processes(): array
    {
        return return [
            [
                'process' => \Any\SingleProcess::class,
                'params' => [
                    'time' => 11,
                ],
                'count' => 1,
            ],
            [
                'process' => \Any\SingleDaemonProcess::class,
                'count' => 2,
            ],
        ];
    }

    protected function prepare(): void
    {
    }
}

守护进程监视器进程仅在1个副本中分叉。

在代码中启动

$singleProcess = new \Any\SingleDaemonWatcherProcess();
$forker = new \Mrden\Fork\Forker($singleProcess);
$forker->run();

通过 bin/forker 启动

php bin/forker --process="\Any\SingleDaemonWatcherProcess"

通过 bin/forker 停止

php bin/forker --process="\Any\SingleDaemonWatcherProcess" --stop=1 将停止所有(包括自身和子进程)

通过 kill 停止

  • kill PIDkill -15 PID - 将仅停止守护进程监视器,子进程将继续工作
  • kill -10 PID - 将停止所有(包括自身和子进程)

通过 bin/forker 仅重新启动守护进程监视器

php bin/forker --process="\Any\SingleDaemonWatcherProcess" --restart=1

通过 bin/forker 重新启动并重新启动子进程

php bin/forker --process="\Any\SingleDaemonWatcherProcess" --restart=1 --process-restartChildren=1