在使用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. 在IIS上部署.net core的webapi项目 以及502.5错误的两种解决方法

    首先要在服务器上面安装.net core https://github.com/dotnet/core/tree/master/release-notes/download-archives 这里面有 ...

  2. Tagging Physical Resources in a Cloud Computing Environment

    A cloud system may create physical resource tags to store relationships between cloud computing offe ...

  3. crossplatform----文本编辑器工具Atom安装

    1.简介 Atom 是 Github 专门为程序员推出的一个跨平台文本编辑器.具有简洁和直观的图形用户界面,并有很多有趣的特点:支持CSS,HTML,JavaScript等网页编程语言.它支持宏,自动 ...

  4. 非参贝叶斯(Bayesian Non-parameter)初步

    0. motivations 如何确定 GMM 模型的 k,既观察到的样本由多少个高斯分布生成.由此在数据属于高维空间中时,根本就无法 visualize,更加难以建立直观,从而很难确定 k,高斯分布 ...

  5. 使用lead分析功能相似的结构9*9乘法口诀功能

    今天兄弟们的帮助,数据库,具有数据如下面的表: no  name 1    a 2    b 3    c 4    d 怎样用一个sql显演示样例如以下结果: ab ac ad bc bd cd 对 ...

  6. apt-spy 软件源更新

    ebian上的apt-get是最快的软件安装方式,不过要用好apt-get,首先得需要找到最快的源,这样安装软件的时候才能获得好的速度,用起来才能得心应手. 有的源在用了一段以后,就会失效,这个时候, ...

  7. XF 定制图片

    using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...

  8. net share列出了Windows的默认共享(包括C盘)

    另外还有单独开启办法: 开启共享方法: 命令行方式:net share 博客=F:\娱乐\种子 我设置了一个名为“博客”的共享,路径为:“F:\娱乐\种子”. GUI方式:找到“F:\娱乐”的“种子” ...

  9. PostMessage和SendMessage有什么区别?(有EnumChildWindowsProc的例子)

    PostMessage只是把消息放入队列,不管其他程序是否处理都返回,然后继续执行;而SendMessage必须等待其他程序处理消息后才返回,继续执行.PostMessage的返回值表示PostMes ...

  10. PHP 实现自动加载器(Autoloader)

    我们知道PHP可以实现自动加载,避免了繁重的体力活,代码更规范,整洁.那如果我们把这个自动加载再升华一下,变成自动加载类,每次只需要引入这个类,那么其他类就自动加载了,已经开源,仓库地址在这里.同时如 ...