版本信息
swoole version ? ? ? ? ? ? ? ?4.6.7 php version ? ? ? ? ? ? ? ? ? 7.4.20 easyswoole version ? ? ? ? ? ?3.4.6
场景? ?以前总是用python 去处理一下redis订阅发布的数据信息? ?现在使用Eayswoole 框架的自定义进程? 消费其订阅发布的信息 进而处理数据。
步骤如下:
在其App/Process 目录下 新增对象文件 如ToSubscribeRedis.php
<?php
namespace App\Process;
use EasySwoole\Component\Process\AbstractProcess;
use EasySwoole\EasySwoole\Config;
use Swoole\Coroutine;
use Swoole\Process;
use EasySwoole\RedisPool\RedisPool;
class ToSubscribeRedis extends AbstractProcess
{
public $dev;
protected function run($arg)
{
//$redis = RedisPool::defer("redis");
var_dump('### 开始运行redis自定义进程 start ###');
go(function () {
$redis = RedisPool::defer("redis");
$redis->subscribe(function (\EasySwoole\Redis\Redis $redis, $pattern, $str) {
$info = json_decode($str, true);
var_dump($info);
// $data = $redis->unsubscribe('subscribe_name');
//$redis->setSubscribeStop(true);
Coroutine::sleep(1);
}, 'subscribe_name');
});
}
public function onShutDown()
{
// TODO: Implement onShutDown() method.
}
public function onReceive(string $str, ...$args)
{
// TODO: Implement onReceive() method.
}
}
其中的var_dump($info); 就是其redis订阅发布的信息
重点:
在上面新建好ToSubscribeRedis.php 代码后,还需要注册? 还可以使用!!
在框架根目录? EasyswooleEvent.php 中? 在其mainServerCreate方法中添加如下行:
\EasySwoole\Component\Process\Manager::getInstance()->addProcess(new \App\Process\ToSubscribeRedis?('sub'));
完整的伪代码 如下:
<?php
namespace EasySwoole\EasySwoole;
use App\WebSocket\TCPParser;
use EasySwoole\EasySwoole\AbstractInterface\Event;
use EasySwoole\EasySwoole\Config;
use EasySwoole\EasySwoole\Swoole\EventRegister;
use EasySwoole\Http\Request;
use EasySwoole\Http\Response;
class EasySwooleEvent implements Event
{
public static function initialize()
{
date_default_timezone_set('Asia/Shanghai');
// 加载Config下所有配置
self::loadConfig();
}
public static function mainServerCreate(EventRegister $register)
{
//此处省略N多代码 ....
//注册redis订阅进程 读取redis 发布订阅信息
\EasySwoole\Component\Process\Manager::getInstance()->addProcess(new \App\Process\ToSubscribeRedis('sub'));
}
public static function loadConfig()
{
Config::getInstance()->loadDir(EASYSWOOLE_ROOT . '/Config');
}
}
然后重启框架
php easyswoole server start
就可以看到打印的那个信息了 。
?
|