码迷,mamicode.com
首页 > 其他好文 > 详细

使用事件注册器进行swoole代码封装

时间:2018-09-19 14:52:38      阅读:278      评论:0      收藏:0      [点我收藏+]

标签:key   cal   应用   ons   exit   array   type   exce   简单   

在使用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代码封装

标签:key   cal   应用   ons   exit   array   type   exce   简单   

原文地址:https://www.cnblogs.com/shiwenhu/p/9674218.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!