zoukankan      html  css  js  c++  java
  • 使用事件注册器进行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;
            });
        }
    }
  • 相关阅读:
    4月份学习计划
    windows下下载安装python、 pip、nose
    Windows下怎么搭建Python+Selenium的自动化环境
    pthon之异常、文件练习题
    python 元组 字符串 字典 列表嵌套练习题1
    硬件访问服务AIDL JNI 方式
    Android 加载图片优化(二) LruCache DiskLruCache
    Android 加载图片优化(一)
    ubuntu 下 4412烧写SuperBoot
    metro WCF
  • 原文地址:https://www.cnblogs.com/shiwenhu/p/9674218.html
Copyright © 2011-2022 走看看