🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
### 进程池管理 进程池管理其实也是基于自定义进程实现的多进程处理。为每个worker进程创建绑定的进程,这些绑定的进程专门为绑定的worker服务,类似于service mesh的服务管理思想。主要包含两个类 ~~~ Swoolefy\Core\Pools\PoolsManager ~~~ PoolsManager主要是管理pools创建和通信的类,具体代码可以查看源码 ~~~ Swoolefy\Core\Pools\AbstractProcessPools ~~~ AbstractProcessPools是一个处理的抽象类,自定义进程处理的逻辑过程必须继承该类。主要实现三个方法: ~~~ // 此方法是自定义启动后执行的方法 public abstract function run(Process $process); // 此方法是自定义进程kill掉时执行的方法 public abstract function onShutDown(); // 此方法是与worker通信接收worker的write数据的方法 public abstract function onReceive($str); ~~~ 例如下面的一个进程,专门用来发短信的。 ~~~ <?php namespace App\Pools\TestPools; use Swoole\Process; use Swoolefy\Core\Swfy; use Swoolefy\Core\Pools\AbstractProcessPools; // 继承实现AbstractProcessPools的方法 class Sms extends AbstractProcessPools { public $chan_mysql; public function run(Process $process) { // 启动时执行 $args = $this->getArgs(); //var_dump($args); } public function onReceive($str) { // worker 发送str信息,这里触发短信发送,主要逻辑处理 var_dump('gggggg'); } public function onShutDown() {} } ~~~ ### 如何创建 1、在启动类的onInit中创建注册进程池 ~~~ <?php namespace App\Init; use Swoolefy\Core\Swfy; use Swoolefy\Core\EventHandler; use Swoolefy\Core\Process\ProcessManager; use Swoolefy\Core\Pools\PoolsManager; class Init extends EventHandler { // 创建上面的Sms的进程,为每个worker进程创建2个sms进程来处理发短信,那么每个worker进程在处理业务时,就有专有worker进程来处理sms业务了,而且不会发生所谓多个进程争抢发送的问题,因为worker是绑定进程的 /** * addProcess 添加创建进程并绑定当前worker进程 * @param string $processName //当前进程名称,例如sms * @param string $processClass // 处理类 * @param int $process_num_bind_worker 每个worker绑定的进程数,也即是为每个worker附加的自定义进程数,默认绑定一个process * @param boolean $async // 是否异步 * @param array $args // 变量参数 * @param mixed $extend_data //额外变量 PoolsManager::getInstance()->addProcessPools('sms', \App\Pools\TestPools\Sms::class, 1, true, []); } ~~~ 上面很简单就注册了worker的进程池,那么接下来如何使用呢?其实很简单 ``` // 在worker进程中 PoolsManager::getInstance()->writeByProcessPoolsName('sms', "请发送sms"); ``` // 在自定义进程的onReceive()中就可以接受到信息了 ``` public function onReceive($str) { // worker 发送str信息,这里触发短信发送,主要逻辑处理 var_dump($str);// 此处将打印出 "请发送sms" } ``` 那小伙伴有会问,那自定义进程如何与wroker通信呢?其实也很简单直接调用sendMessage()方法可以直接将信息发送给对应的worker进程 ``` public function onReceive($str) { // worker 发送str信息,这里触发短信发送,主要逻辑处理 var_dump($str);// 此处将打印出 "请发送sms" // 处理完sms发送逻辑 // 调用sendMessage发信息给对应的worker进程 $this->sendMessage("自定义进程处理完了sms发送"); } ``` 那么问题又来了,worker进程此时又该如何接收到绑定自定义进程发送返回的信息呢?这个也很简单,直接在 onPipeMessage($server, $src_worker_id, $message)中处理。这个方法在protocol/App/HttpServer.php中 ~~~ public function onPipeMessage($server, $src_worker_id, $message) { // 此处会输出返回的内容: "自定义进程处理完了sms发送" var_dump($message); ~~~ 至此,整个流程算是完成了。