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