进程池-Swoole

优质
小牛编辑
136浏览
2023-12-01

imi 中对进程池的创建和运行做了简单封装,基于Swoole\Process\Pool实现。

定义进程池

<?php
namespace XinchengApi\api\ProcessPool;

use Imi\Process\Annotation\ProcessPool;

/**
 * @ProcessPool(name="进程名称")
 */
class Sms extends \Imi\Process\BasePoolProcess
{
    public function run(\Swoole\Process\Pool $pool, int $workerId, $name, $workerNum, $args, $ipcType, $msgQueueKey)
    {
        // 做一些事情
    }
}

释放连接池

因为我们有些进程是用不到,或者不需要所有进程池的。进程池资源连着也是浪费,所有提供一个注解,用以释放。

run() 方法上使用 @PoolClean 注解即可,类:Imi\Pool\Annotation\PoolClean

@PoolClean 参数:

mode 模式,allow-白名单,deny-黑名单

list=[] 连接池名称列表。mode=allow则为保留的连接池,mode=deny则为关闭的连接池

注解

@ProcessPool

/**
 * 进程池名称
 * @var string
 */
public $name;

/**
 * 进程数量
 *
 * @var int
 */
public $workerNum = 1;

/**
 * 进程间通信的模式,默认为0表示不使用任何进程间通信特性
 *
 * @var integer
 */
public $ipcType = 0;

/**
 * 消息队列key
 *
 * @var string
 */
public $msgQueueKey = null;

创建进程池

通过注解中的进程名称创建进程,返回\Swoole\Process类型的对象,需要手动调用start()方法来运行进程。

/**
 * 创建进程池
 * 本方法无法在控制器中使用
 * 返回\Swoole\Process\Pool对象实例
 * 
 * @param string $name
 * @param int $workerNum 指定工作进程的数量
 * @param array $args
 * @param int $ipcType 进程间通信的模式,默认为0表示不使用任何进程间通信特性
 * @param string $msgQueueKey
 * @return \Swoole\Process\Pool
 */
public static function create($name, $workerNum = null, $args = [], $ipcType = 0, $msgQueueKey = null): \Swoole\Process\Pool

启动连接池进程

命令:bin/imi process/pool -name 进程名

其它参数可加上-h参数查看