moonspot/supervisor

管理分叉进程

dev-master 2018-02-22 01:01 UTC

This package is auto-updated.

Last update: 2024-09-11 02:49:20 UTC


README

Supervisor 类将通过回调管理子进程,该回调在子进程分叉后被调用。它将重启新子进程以替换退出的子进程。

为什么?

Supervisor 对于任何需要运行长时间运行的 PHP 进程的应用程序都很有用。

现代应用程序开发有时需要运行长时间运行的 PHP 进程。因为 Supervisor 是 PHP,它允许您在不进行任何修改的情况下分叉和管理运行现有 PHP 代码的进程。

这种情况之一是管理 Gearman 工作进程。实际上,这个项目受到了 GearmanManager 管理工作进程的方式的启发。计划是在 GearmanManager 的未来版本中将它作为处理进程管理的代码。

示例

<?php

// Some Worker Class

class SomeWorker
{
    public $keepWorking = true;

    public function doWork()
    {
        while($this->keepWorking) {
            // do stuff
            usleep(500000);
        }
    }
}
<?php

require __DIR__."/../../src/Supervisor.php";
require __DIR__."/SomeWorker.php";

use \Moonspot\Supervisor\Supervisor;

class MyApplication
{
    protected $super;

    protected $worker;

    public function __construct()
    {
        $this->super = new Supervisor(
            array($this, "monitor"),
            array($this, "log"),
            array($this, "handleSignal")
        );

    }

    public function startWorkers($count)
    {
        for($x=0; $x<$count; $x++){
            $this->super->addChild(
                array($this, "startWorker"),
                array(),
                3600000
            );
        }

        $this->super->wait();
    }

    public function startWorker()
    {
        $this->worker = new SomeWorker();
        $this->worker->doWork();
    }

    public function handleSignal($signal) {
        $this->worker->keepWorking = false;
    }

    public function monitor()
    {
        // we could call $this->super->stop() or $this->super->restart() here
    }

    public function log($log)
    {
        list($sec, $ms) = explode(".", number_format(microtime(true), 3));
        echo "[".date("Y-m-d H:i:s").".$ms] $log\n";
    }
}
<?php

require __DIR__."/MyApplication.php";

$app = new MyApplication();
$app->startWorkers(10);