自定义进程

PHP自带的pcntl存在许多不足,不支持重定向标准输入和输出及进程间通信的功能,且容易使用错误。
EasySwoole基于SwooleProcess模块进行了封装,来创建工作进程,用于处理耗时任务,消息队列,等其它的特殊任务。
EasySwoole启动时,会自动创建注册的进程,并执行进程指定的逻辑代码,进程意外退出时,会被重新拉起。

创建一个自定义进程

需要定义一个进程类继承EasySwoole\Component\Process\AbstractProcess

定义进程内执行逻辑回调

protected function run($arg)
{
    // TODO: Implement run() method.
    $this->getProcessName(); // 获取注册进程名称

    $this->getProcess(); // 获取进程实例 \Swoole\Process

    $this->getPid(); // 获取当前进程Pid

    $this->getArg(); // 获取注册时传递的参数
}

进程间通信Pipe回调

protected function onPipeReadable(Process $process)
{
    // 该回调可选
    // 当主进程对子进程发送消息的时候 会触发
    $process->read(); // 读取消息
}

进程间异常回调

protected function onException(\Throwable $throwable, ...$args)
{
    // 该回调可选
    // 捕获run方法内抛出的异常
    // 这里可以通过记录异常信息来帮助更加方便的知道出现问题的代码
}

进程信号回调

protected function onSigTerm()
{
    // 当进程接收到 SIGTERM 信号触发该回调
}

进程意外退出回调

protected function onShutDown()
{
    // 该回调可选
    // 进程意外退出 触发此回调
    // 大部分用于清理工作
}

注册进程

EasySwoole全局的mainServerCreate事件中进行进程注册

$processConfig = new \EasySwoole\Component\Process\Config();
$processConfig->setProcessName('CustomProcess');//设置进程名称
$processConfig->setProcessGroup('Custom');//设置进程组名称
$processConfig->setArg(['user' => 'root']);//传参
$processConfig->setRedirectStdinStdout(false);//是否重定向标准io
$processConfig->setPipeType($processConfig::PIPE_TYPE_SOCK_DGRAM);//设置管道类型
$processConfig->setEnableCoroutine(true);//是否自动开启协程
$processConfig->setMaxExitWaitTime(3);//最大退出等待时间
\EasySwoole\Component\Process\Manager::getInstance()->addProcess(new CustomProcess($processConfig));

完整示例代码

<?php
namespace App\Process;

use EasySwoole\Component\Process\AbstractProcess;
use Swoole\Process;

class CustomProcess extends AbstractProcess
{
    protected function run($arg)
    {
        // TODO: Implement run() method.
        $this->getProcessName(); // 获取注册进程名称

        $this->getProcess(); // 获取进程实例 \Swoole\Process

        $this->getPid(); // 获取当前进程Pid

        $this->getArg(); // 获取注册时传递的参数
    }

    protected function onPipeReadable(Process $process)
    {
        // 该回调可选
        // 当主进程对子进程发送消息的时候 会触发
        $process->read(); // 读取消息
    }

    protected function onException(\Throwable $throwable, ...$args)
    {
        // 该回调可选
        // 捕获run方法内抛出的异常
        // 这里可以通过记录异常信息来帮助更加方便的知道出现问题的代码
    }

    protected function onShutDown()
    {
        // 该回调可选
        // 进程意外退出 触发此回调
        // 大部分用于清理工作
    }

    protected function onSigTerm()
    {
        // 当进程接收到 SIGTERM 信号触发该回调
    }

}

进程管理

EasySwoole内置对于Process的命令行操作,方便开发者友好的去管理Process

可执行php easyswoole process -h来查看具体操作。

显示所有进程

php easyswoole process show

如果想要以MB形式显示:

php easyswoole process show -d

杀死指定进程(PID)

php easyswoole process kill --pid=PID

杀死指定进程组(GROUP)

php easyswoole process kill --group=GROUP_NAME

杀死所有进程

php easyswoole process killAll

强制杀死进程

需要带上-f参数,例如:

php easyswoole process kill --pid=PID -f