使用事件注册器进行swoole代码封装
在使用swoole的时候,事件回调很难维护与编写,写起来很乱。特别在封装一些代码的时候,使用这种注册,先注册用户自己定义的,然后注册些默认的事件函数。
Server.php
class Server
{
public function __construct()
{
$server = new \swoole_http_server('0.0.0.0', 9501);
// 创建一个注册器,其实这个很简单,就是将一些要执行的回调函数进统一以回调名为键,要执行的方法放在一个数组中['workerStart'=>[callback]]
$register = new EventRegister();
// 首先注册默认的
$this->finalHook($register);
// 然后是用户自定义的,所以只给定应用层这些接口来写回调
WPHPEvent::mainServerCreate($register);
$events = $register->all(); foreach ($events as $event => $callback) {
$server->on($event, function () use ($callback) {
$args = func_get_args();
foreach ($callback as $item) {
// 可以使用这三种方式调用
// call_user_func($item, ...$args);
// call_user_func_array($item, $args);
$item(...$args);
}
});
}
$server->start(); } private function finalHook(EventRegister $register)
{ $register->add('workerStart', function () {
cli_set_process_title('wphp-work-zhangsan');
});
// ... $register->add('request', function ($request, $response) {
$response->header("Content-Type", "text/html; charset=utf-8");
$response->end("<h1>Hello Swoole. #" . rand(1000, 9999) . "</h1>");
});
}
}
MultiContainer.php
class MultiContainer
{
private $container = [];
private $allowKeys = null; public function __construct(array $allowKeys)
{
$this->allowKeys = $allowKeys;
} public function add($key, $item)
{
if (!in_array($key, $this->allowKeys)) {
return false;
}
$this->container[$key][] = $item;
return $this;
} public function set($key, $item)
{
if (!in_array($key, $this->allowKeys)) {
return false;
}
$this->container[$key] = [$item];
return $this;
} public function delete($key)
{
unset($this->container[$key]);
return $this;
} public function get($key)
{
if (isset($this->container[$key])) {
return $this->container[$key];
}
return null;
} public function all()
{
return $this->container;
} }
Event.php
class Event extends MultiContainer
{
public function add($key, $item)
{
if (is_callable($item)) {
return parent::add($key, $item);
} else {
return false;
}
} public function set($key, $item)
{
if (is_callable($item)) {
return parent::set($key, $item);
}
} }
EventRegister.php
class EventRegister extends Event
{
public function __construct()
{
parent::__construct([
'start', 'shutdown', 'workerStart', 'workerStop', 'workerExit', 'timer',
'connect', 'receive', 'packet', 'close', 'bufferFull', 'bufferEmpty', 'task',
'finish', 'pipeMessage', 'workerError', 'managerStart', 'managerStop',
'request', 'handShake', 'message', 'open'
]);
} public function add($key, $item)
{
if (!parent::add($key, $item)) {
throw new \Exception('错误的调用方式');
}
return $this;
} public function set($key, $item)
{
if (!parent::set($key, $item)) {
throw new \Exception('错误的调用方式');
}
return $this;
}
}
WPHPEvent.php
class WPHPEvent
{
public static function mainServerCreate($register)
{
$register->add('workerStart', function () {
echo 22;
});
}
}
使用事件注册器进行swoole代码封装的更多相关文章
- 事件查看器常见ID代码解释
ID 类型 来 源 代 表 的 意 义 举 例 解 释 信息 Serial 在验证 \Device\Serial1 是否确实是串行口时,系统检测到先进先出方式(fifo).将使用该方式. 错误 W ...
- 编写高质量代码改善C#程序的157个建议——建议151:使用事件访问器替换公开的事件成员变量
建议151:使用事件访问器替换公开的事件成员变量 事件访问器包含两部分内容:添加访问器和删除访问器.如果涉及公开的事件字段,应该始终使用事件访问器.代码如下所示: class SampleClass ...
- php设计模式之单例(多例),注册器,观察者模式
单例(Singleton)模式和不常见的多例(Multiton)模式控制着应用程序中类的数量.如模式名称,单例只能实例化一次,只有一个对象,多例模式可以多次实例化. 基于Singleton的特性,我们 ...
- Windows 事件查看器(收集)
原文:Windows 事件查看器(收集) 事件查看器相当于一本厚厚的系统日志,可以查看关于硬件.软件和系统问题的信息,也可以监视 Windows 的安全事件 提示:除了可以在"控制面板→管理 ...
- DjangoRestFramework学习三之认证组件、权限组件、频率组件、url注册器、响应器、分页组件
DjangoRestFramework学习三之认证组件.权限组件.频率组件.url注册器.响应器.分页组件 本节目录 一 认证组件 二 权限组件 三 频率组件 四 URL注册器 五 响应器 六 分 ...
- day91 DjangoRestFramework学习三之认证组件、权限组件、频率组件、url注册器、响应器、分页组件
DjangoRestFramework学习三之认证组件.权限组件.频率组件.url注册器.响应器.分页组件 本节目录 一 认证组件 二 权限组件 三 频率组件 四 URL注册器 五 响应器 六 分 ...
- 用条件变量实现事件等待器的正确与错误做法--转自陈硕的Blog
用条件变量实现事件等待器的正确与错误做法 TL;DR 如果你能一眼看出 https://gist.github.com/chenshuo/6430925 中的那 8 个 Waiter classes ...
- MVP+Dagger2+Rxjava+Retrofit+GreenDao 开发的小应用,包括新闻、图片、视频3个大模块,代码封装良好
练习MVP架构开发的App,算是对自己学过的知识做一个总结,做了有一段时间,界面还算挺多的.代码量还是有的,里面做了大量封装,总体代码整理得非常干净,这个我已经尽力整理了. 不管是文件(java.xm ...
- Server 2008 R2 事件查看器实现日志分析
在 windows server 2008 R2 中,可以通过点击 "开始" -> "管理工具" -> "事件查看器" ,来打开 ...
随机推荐
- Linux下编译,要下载tar.xz,而不要下载zip,因为换行的编码不一样,对.h.cpp没有影响,但是对脚本有影响 good
原因是 在win下编辑的时候,换行结尾是\n\r , 而在linux下 是\n,所以才会有 多出来的\r但是这个我是直接下载的官网文件解压的,没有动过啊. 破案了. linux下编译要下 .tar.x ...
- DDD实战5 实现上下文服务
通过服务来协调领域对象,来添加产品用例. 1.要实现产品上下文的服务,首先新建一个项目,在Product解决方案文件夹下面新建一个项目,项目的名称为:Product.AppSrv. 2.这个项目首先引 ...
- 用WPF窗体打造个性化界面的图片浏览器
原文:用WPF窗体打造个性化界面的图片浏览器 本文使用WPF窗体(XAML及C#)与Win Form控件(FolderBrowserDialog)结合的方式, 演示制作了一个简易漂亮的WPF图片浏览器 ...
- Efficient store queue architecture
One embodiment of the present invention provides a store queue that applies the stores to a memory s ...
- 静态库、动态库,dll文件、lib文件,隐式链接、显式链接浅见
静态链接.动态链接 静态库和动态库分别应用在静态链接方式和动态链接方式中,所谓静态链接方式是指在程序执行之前完成所有的链接工作,把静态库一起打包合入,生成一个可执行的目标文件(EXE文件).所谓动态链 ...
- 一种基于HBase韵海量图片存储技术
针对海量图片存储,已有若干个基于Hadoop的方案被设计出来.这些方案在系统层小文件合并.全局名字空间以及通用性方面存在不足.本文基于HBase提出了一种海量图片存储技术,成功解决了上述问题.本文将介 ...
- [视频]产品营销之拍出好电子产品,Peter Belanger是如何为苹果产品拍照的
Peter Belanger –他就是那些颠覆你想象的苹果产品照片的摄影师.作为旧金山的顶级产品图片设计师的 Peter,他还拥有 eBay, Nike, Pixer 和 Square 等客户. 让我 ...
- WPF特效-绘图
原文:WPF特效-绘图 WPF玩起来还是挺炫酷的.我实现的效果:不同色块交叉,交叉部分颜色叠加显示.(叠加部分暂时用随机颜色代替).单独色块点击弹出以色块颜色为主的附 ...
- sql分组统计多列值
select BQDM,sum(case when HFBZ='0' then 1 ELSE 0 end) bxschf,sum(case when HFBZ='1' then 1 ELSE 0 en ...
- win10 uwp 如何打包Nuget给其他人
原文:win10 uwp 如何打包Nuget给其他人 本文告诉大家,如果自己有做一些好用的库,如何使用 Nuget 打包之后上传,分享给大家. 首先需要知道一些 Nuget 打包需要知道的,请看 wi ...