在使用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. 在React开发中遇到的问题——数组引用赋值

    在React开发中遇到了一个问题: 需求是在一个选择组件中选择数据mydata数组,确定后将mydata数组返回到父组件,再次打开该选择组件时,从父组件获取之前选择的数据mydata并显示为已选择. ...

  2. “TNS-03505:无法解析名称”问题解决一例

    1.  问题情境 开发人员,在windows新环境ORACLEclient.配置"tnsnames.ora"后,准备连接Linux环境的ORACLE数据库,使用tnsping报TN ...

  3. EntityFrameworkCore 单表树状结构配置

    数据结构 public class TreeNode { [Key] public long Id { get; set; } public string NodeName { get; set; } ...

  4. Httpclient Fluent API简单封装

    import java.io.IOException;import java.util.ArrayList;import java.util.HashMap;import java.util.List ...

  5. hexo-theme-next

    Hexo Next github主页:https://github.com/iissnan/hexo-theme-next 官网地址:http://theme-next.iissnan.com/ 一篇 ...

  6. 模拟QQ窗口抖动效果(通过MoveWindow和Sleep进行模拟)

    RECT rtWindow; GetWindowRect(&rtWindow); //long x = 400; //long y = 200; long x = rtWindow.left; ...

  7. windows管理员利器之用Log Parser Studio分析IIS日志(附逐浪CMS官方命令集)

    原文:windows管理员利器之用Log Parser Studio分析IIS日志(附逐浪CMS官方命令集) Log Parser Studio是一个强大的IIS图形分析工具,值得推荐. 1. 安装L ...

  8. Reverse Engineering Custom DataTypes -> GUID() in SQL Server to PostgreSQL

    原文 https://archive.sap.com/discussions/thread/3641585 First you reverse engineer from a script where ...

  9. Windows实用小工具-问题步骤记录器

    今晚给大家介绍个实用的好工具,可以做简单的问题记录,再也不用截图加注释这么辛苦了····· 经测试,这东东在win7,2008 及2008R2里适用,也就是说,在win7以上的系统中才有.好了,下面直 ...

  10. Use Spring @Scheduled To Achieve Timing Task

    Today I have a chance to use the @Scheduled to achieve a timing task.It is useful.Anyway,it was the ...