使用事件注册器进行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 中,可以通过点击 "开始" -> "管理工具" -> "事件查看器" ,来打开 ...
随机推荐
- DDD实战2 创建领域基础类库项目
1.创建领域基础类库项目 取名DDD.DomainBase 放置于基础设施层 2.新建IEntity接口,内部创建2个属性 code和Id用于限定 public interface IEntity { ...
- 特征价格(Hedonic price)
特征价格法,又称 Hedonic 模型法和效用估价法,认为房地产由众多不同的特征组成,而房地产价格是由所有特征带给人们的效用决定的.由于各特征的数量及组合方式不同,使得房地产的价格产生差异.因此,如能 ...
- win10系统应用打不开
可能有一些用户升级Win10之后遇到了应用商店.应用打不开或闪退的问题,此时可尝试通过下面的一些方法来解决. 1.点击任务栏的搜索(Cortana小娜)图标,输入Powershell,在搜索结果中右键 ...
- UVA 10641 - Barisal Stadium(DP + 几何)
题目链接:10641 - Barisal Stadium 题意:逆时针给定n个点,在给m个灯,每一个灯有一个花费,要求最小花费使得全部边能被灯照到 思路:用向量叉积推断向量的顺逆时针关系,从而预处理出 ...
- cefsharp 与webbrowser简单对比概述
原文:cefsharp 与webbrowser简单对比概述 有个项目需要做个简单浏览器,从网上了解到几个相关的组件有winform自带的IE内核的WebBrowser,有第三方组件谷歌内核的webki ...
- otrs离线部署
OTRS5离线部署 参考地址:https://doc.otrs.org.cn/doc/manual/admin/stable/zh_CN/html/manual-installation-of-otr ...
- 关于hibernate组件配置
建立关系数据模型的一个重要原则是在不会导致数据冗余的前提下,尽可能减少数据库表的数目及表之间的外键参照关系.以员工信息为例,员工信息中有员工的家庭地址信息,如果把地址信息单独放在一张表中,然后建立员工 ...
- 最通俗易懂的方式让你理解 Swift 的函数式编程
函数式编程(Functional Programming)是相对于我们常用的面向对象和面向过程编程的另外一种开发思维方式,它更加强调以函数为中心.善用函数式编程思路,可以对我们的开发工作有很大的帮助和 ...
- 区别JS和DOM对象
<div> <button id="bt" onclick="ChangeColor()">Clike To Change Color& ...
- linux 修改 ssh 的端口号,启动hg服务
修改 ssh 的端口号 # vim /etc/ssh/sshd_config 将其中的 Port 改为 想要修改的端口号. # service sshd restart 启动hg服务 # hg ...