在使用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代码封装的更多相关文章

  1. 事件查看器常见ID代码解释

    ID 类型 来   源 代 表 的 意 义 举 例 解 释 信息 Serial 在验证 \Device\Serial1 是否确实是串行口时,系统检测到先进先出方式(fifo).将使用该方式. 错误 W ...

  2. 编写高质量代码改善C#程序的157个建议——建议151:使用事件访问器替换公开的事件成员变量

    建议151:使用事件访问器替换公开的事件成员变量 事件访问器包含两部分内容:添加访问器和删除访问器.如果涉及公开的事件字段,应该始终使用事件访问器.代码如下所示: class SampleClass ...

  3. php设计模式之单例(多例),注册器,观察者模式

    单例(Singleton)模式和不常见的多例(Multiton)模式控制着应用程序中类的数量.如模式名称,单例只能实例化一次,只有一个对象,多例模式可以多次实例化. 基于Singleton的特性,我们 ...

  4. Windows 事件查看器(收集)

    原文:Windows 事件查看器(收集) 事件查看器相当于一本厚厚的系统日志,可以查看关于硬件.软件和系统问题的信息,也可以监视 Windows 的安全事件 提示:除了可以在"控制面板→管理 ...

  5. DjangoRestFramework学习三之认证组件、权限组件、频率组件、url注册器、响应器、分页组件

    DjangoRestFramework学习三之认证组件.权限组件.频率组件.url注册器.响应器.分页组件   本节目录 一 认证组件 二 权限组件 三 频率组件 四 URL注册器 五 响应器 六 分 ...

  6. day91 DjangoRestFramework学习三之认证组件、权限组件、频率组件、url注册器、响应器、分页组件

    DjangoRestFramework学习三之认证组件.权限组件.频率组件.url注册器.响应器.分页组件   本节目录 一 认证组件 二 权限组件 三 频率组件 四 URL注册器 五 响应器 六 分 ...

  7. 用条件变量实现事件等待器的正确与错误做法--转自陈硕的Blog

    用条件变量实现事件等待器的正确与错误做法 TL;DR 如果你能一眼看出 https://gist.github.com/chenshuo/6430925 中的那 8 个 Waiter classes ...

  8. MVP+Dagger2+Rxjava+Retrofit+GreenDao 开发的小应用,包括新闻、图片、视频3个大模块,代码封装良好

    练习MVP架构开发的App,算是对自己学过的知识做一个总结,做了有一段时间,界面还算挺多的.代码量还是有的,里面做了大量封装,总体代码整理得非常干净,这个我已经尽力整理了. 不管是文件(java.xm ...

  9. Server 2008 R2 事件查看器实现日志分析

    在 windows server 2008 R2 中,可以通过点击 "开始" -> "管理工具" -> "事件查看器" ,来打开 ...

随机推荐

  1. MVC模式简单介绍

    模型-视图-控件(model-View-Controller)MVC结构是一种开发模块的方法,它将数据存储和数据处理从数据的可视化表示中分离出来.存储和处理数据的组件称为模型,它包括模块的实际内容.表 ...

  2. 新版本MenuDemo——使用Duilib模拟Windows本机菜单

    相信玩Duilib朋友已经开始期待一个很长的文章.由于我的文章在一周前公布--"无焦点窗体的实现"里面提到了无焦点窗体在菜单里面的应用,并承诺大家,写一个关于Menu实现的Demo ...

  3. Unity3d 鼠标的事件GetMouseButtonDown()、GetMouseButton()、GetMouseButtonUp()

    当鼠标按键按下时,返回一次true,后面參数0是左键,1是右键,2是中键 if(Input.GetMouseButtonDown(0)) Debug.Log("Pressed left cl ...

  4. NS2网络模拟(6)-homework02.tcl

    1: #NS2_有线部分\homework02.tcl 2: 3: #Create a simulator object 4: set ns [new Simulator] 5: 6: #Define ...

  5. c# 守护进程,WPF程序自守护

    原文:c# 守护进程,WPF程序自守护 版权声明:本文为博主原创文章,转载请注明出处. https://blog.csdn.net/lwwl12/article/details/79035246 如何 ...

  6. [bug系列]Method not found: 'Void Microsoft.EntityFrameworkCore.Storage.Internal.RelationalCommandBuilderFactory

    bug由来 最近开始学习NetCore,想通过实战使用NetCore做一个集成数据库存储Redis缓存的WebApi项目,由于MSSQL的庞大体积,最终决定使用轻量级关系型数据库MySql. 所以最终 ...

  7. JS的innerText和innerHTML

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  8. jquery 可以给事件传参数

    <!DOCTYPE html><html><head><meta http-equiv="Content-Type" content=&q ...

  9. 初探WINDOWS下IME编程

    初探WINDOWS下IME编程作者:广东南海市昭信科技有限公司-李建国 大家知道,DELPHI许多控件有IME属性.这么好用的东西VC可没自带,怎么办呢?其实,可通过注册表,用API实现.下面说一下本 ...

  10. Centos重启关机命令

    Linux centos重启命令: 1.reboot   普通重启 2.shutdown -r now 立刻重启(root用户使用) 3.shutdown -r 10 过10分钟自动重启(root用户 ...