EasySwoole 是一款基于Swoole4.x开发的全协程、常驻内存型的分布式框架,专为API而生,友好地支持HTTP、WEB_SOCKET、TCP、UDP多协议混合共存,适合于构建高效的API服务。
此次EasySwoole 3.0.10版本的发布,为大家带来了全新的协程Actor编程模式支持,从而实现编程的高度抽象化,例如,把一个用或者是一个游戏房间都抽象为一个Actor,每个Actor又支持独立的定时器管理,定时器的生命周期与Actor自身一致,从而解决智能硬件的在线监测或是卡牌游戏中发牌时间监测的问题。而EasySwoole的Actor在底层上,不同进程间采用unixsock进行通讯,同进程内采用 swoole channle 作为mail box,从而实现高效的信息收发,在阿里云1核2G的标准机器上,可以实现每秒百万级的Actor间通讯交互。我们以实现一个房间的Actor作为例子:
RoomActor 定义:
namespace App; use EasySwoole\EasySwoole\Actor\AbstractActor; class Room extends AbstractActor { /* 当一个actor退出的时候,会执行的回调 如果是客户端单独发送exit命令给某个actor的时候,你可以return 一个可以被序列化的变量,返回给客户端 若是客户端执行exitAll命令时,则无法接收该消息(等待全部的代价过大) */ function onExit() { // TODO: Implement onExit() method. var_dump($this->actorId().' exit '); } /* 当你的客户端向某个actor推送消息的时候 */ function onMessage($arg) { // TODO: Implement onCommand() method. var_dump($arg); return $this->actorId().' msg at '.time(); } /* 当该Actor被创建的时候 */ function onStart() { // TODO: Implement onStart() method. var_dump($this->actorId().' start '); $this->tick(1000,function (){ var_dump('time tick for'.$this->actorId()); }); } }
进行Actor进程注册:
use App\Room; use EasySwoole\EasySwoole\Actor\ActorManager; ActorManager::getInstance()->register(Room::class) ->setActorProcessNum(3)//设置保存actor的进程数目 ->setActorName('RoomActor')//设置Actor的名称,注意一定要注册,且不能重复 ->setMaxActorNum(1000);//设置当前actor中最大的actor数目
单元测试:
require 'vendor/autoload.php'; \EasySwoole\EasySwoole\Core::getInstance()->initialize(); use EasySwoole\EasySwoole\Actor\ActorManager; use App\Room; go(function (){ //模拟注册Actor ,若在整个easySwoole服务中,客户端不必重复注册,因为已经在全局事件中注册了 ActorManager::getInstance()->register(Room::class)->setActorProcessNum(3)->setActorName('RoomActor');//一样需要注册 //添加一个actor ,若成功返回actorId,若超出数目则-1 $ret = ActorManager::getInstance()->actorClient(Room::class)->create([ 'arg'=>1, 'time'=>time() ]); //单独退出某个actor $ret = ActorManager::getInstance()->actorClient(Room::class)->exit('0011'); //单独推送给某个actor //$ret = ActorManager::getInstance()->actorClient(Room::class)->push('0001',2); //单独推送给全部actor // $ret = ActorManager::getInstance()->actorClient(Room::class)->pushMulti([ // "0001"=>'0001data', // '0022'=>'0022Data' // ]); //广播给全部actor //$ret = ActorManager::getInstance()->actorClient(Room::class)->broadcastPush('121212'); //退出全部actor // $ret = ActorManager::getInstance()->actorClient(RoomActor::class)->exitAll(); var_dump($ret); });
此外,此次更新,EasySwoole还提供了FastCache,一个全内存的夸进程快速缓存服务与CronTab规则定时器支持。
EasySwoole 官网地址:https://www.easyswoole.com
EasySwoole QQ 群:633921431