在使用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; }); } }
原文地址:https://www.cnblogs.com/shiwenhu/p/9674218.html
时间: 2024-08-01 12:42:56