t3ran13 / php-process-manager
PHP进程管理器
v0.1.4
2019-01-27 12:21 UTC
Requires
- php: ^7.0
README
PHP上的进程管理器
通过Composer安装
composer require t3ran13/php-process-manager
基本用法
如果您需要将进程状态保存到数据库
<?php namespace MyApp; use ProcessManager\db\RedisManager; use ProcessManager\ProcessManager; $db = new RedisManager(); $pm = (new ProcessManager($db)) ->setProcessName('MainProcess') ->setMaxRunningProcesses(2); if ($pm->hasState()) { $pm->loadState(); } else { $pm->setPriority(25) ->setExecutionStep(1) ->setMaxNTriesOfRun(0) ->setSecondsBetweenRuns(60) ->setMaxLifetimeWithoutResults(30) ->saveState(); } $BEP = (new BlockchainExplorerProcess($db)) ->setProcessName('BlockchainExplorerProcess') ->generateIdFromProcessName();//have to be dane before interaction with state if ($BEP->hasState()) { $BEP->loadState(); } else { $BEP->setPriority(30) ->setExecutionStep(1) ->setMaxNTriesOfRun(7) ->setSecondsBetweenRuns(60) ->setMaxLifetimeWithoutResults(30) ->saveState(); } $test = new PostIsCreatedHandler($db); if ($test->hasState()) { $test->loadState(); } else { $test->setProcessName('PostIsCreatedHandler') ->setPriority(35) ->setExecutionStep(1) ->setMaxNTriesOfRun(0) ->setSecondsBetweenRuns(3) ->setMaxLifetimeWithoutResults(6) ->saveState(); } $pm->addProcess($BEP) ->addProcess($test); $pm->start();
或无需保存状态
<?php namespace MyApp; use ProcessManager\db\RedisManager; use ProcessManager\ProcessManager; $db = new RedisManager(); $pm = (new ProcessManager($db)) ->setProcessName('MainProcess') ->setMaxRunningProcesses(2) ->setPriority(25) ->setExecutionStep(1) ->setMaxNTriesOfRun(0) ->setSecondsBetweenRuns(60) ->setMaxLifetimeWithoutResults(30); $BEP = (new BlockchainExplorerProcess($db)) ->setProcessName('BlockchainExplorerProcess') ->setPriority(30) ->setExecutionStep(1) ->setMaxNTriesOfRun(7) ->setSecondsBetweenRuns(60) ->setMaxLifetimeWithoutResults(30); $test = new PostIsCreatedHandler($db); $test->setProcessName('PostIsCreatedHandler') ->setPriority(35) ->setExecutionStep(1) ->setMaxNTriesOfRun(0) ->setSecondsBetweenRuns(3) ->setMaxLifetimeWithoutResults(6) ->saveState(); $pm->addProcess($BEP) ->addProcess($test); $pm->start();
进程创建
<?php namespace MyApp; use ProcessManager\process\ProcessAbstract; class MyProcess extends ProcessAbstract { private $isStopSignal = false; public function initSignalsHandlers() { pcntl_signal(SIGTERM, [$this, 'signalsHandlers']); //kill pcntl_signal(SIGINT, [$this, 'signalsHandlers']); //ctrl+c pcntl_signal(SIGHUP, [$this, 'signalsHandlers']); //restart process } public function signalsHandlers($signo, $signinfo) { switch ($signo) { case SIGINT: case SIGTERM: case SIGHUP: $this->isStopSignal = true; break; default: } } public function start() { echo PHP_EOL . date('Y-m-d H:i:s') . " {$this->getProcessName()} is started"; while (!$this->isStopNeeded() && !$this->isStopSignal) { //some code pcntl_signal_dispatch(); } } }
或者您可以创建自己的
<?php namespace MyApp; use ProcessManager\process\ProcessInterface; class MyProcess implements ProcessInterface { // your methods }
数据库管理器
进程管理器已提供对Redis工作的数据库管理器实现,并具有以下数据库结构
- DB0
- {keyPrefix}:{id}:className
- {keyPrefix}:{id}:processName
- {keyPrefix}:{id}:priority
- {keyPrefix}:{id}:pid
- {keyPrefix}:{id}:executionStep
- {keyPrefix}:{id}:isRunning
- {keyPrefix}:{id}:nTriesOfRun
- {keyPrefix}:{id}:maxNTriesOfRun
- {keyPrefix}:{id}:secondsBetweenRuns
- {keyPrefix}:{id}:maxLifetimeWithoutResults
- {keyPrefix}:{id}:lastUpdateDatetime
- {keyPrefix}:{id}:data:*
- {keyPrefix}:{id}:errors:*
或者您可以创建自己的数据库管理器
<?php namespace MyApp; use ProcessManager\db\DBManagerInterface; class MyDBManager implements DBManagerInterface { public function newConnect(){ // TODO: Implement newConnect() method. } public function updProcessStateById($id,$fields){ // TODO: Implement updProcessStateById() method. } public function getProcessStateById($id,$field = null){ // TODO: Implement getProcessStateById() method. } public function addErrorToList($id,string $error){ // TODO: Implement addErrorToList() method. } }