Резюме
Глядя на название, я не знаю, что хочет сказать автор. Недавно, глядя на Swool, я столкнулся с проблемой разъединения при инкапсуляции фреймворка. Развязка не всем незнакома. Это разделение представляет собой демонстрацию событий прослушивания и обнаружения сердцебиения. Давайте посмотрим прямо на проблему.
Решения
Я хочу добавить прослушиватели событий при запуске Swool, такие как реестр в RPC, какие службы я запускаю и предоставляю аналогичные сценарии и т. Д., Но это всего лишь прослушиватель событий, а что, если больше? Например, когда я получаю запрос, получаю сообщение, закрываю соединение и т. Д., Вам нужно создать много времени для прослушивания, на этот раз вы можете запустить все события для регистрации, а затем посмотреть, как код прост и грубая реализация.
php namespace LoyaltyLu\Core; use LoyaltyLu\Core\Event\Event; use Swoole\Http\Server; class Http { ... public function start() { $reload = Reload::get_instance(); $reload->watch = [CONFIG_PATH, FRAME_PATH, APP_PATH]; $reload->md5Flag = $reload->getMd5(); # Actively Collect Existing Events Collect Listener Directory $this->collecEvent(); // timer swoole_timer_tick(3000, function () use ($reload) { if ($reload->reload()) { $this - > server - > reload ();// restart } }); Event::trigger('start', ['sss']); } /** * Collect events */ public function collecEvent() { $files = glob(EVENT_PATH . "/*.php"); if (!empty($files)) { foreach ($files as $dir => $fileName) { include "{$fileName}"; $fileName = explode('/', $fileName); $className = explode('.', end($fileName))[0]; $nameSpace ='App\\\ Listener\\. $className; can be placed in the configuration file if (class_exists($nameSpace)) { $obj = new $nameSpace; # Get the event name you defined and read the class document annotations using reflection $re = new \ReflectionClass($obj); if (strlen($re->getDocComment()) < 2) { Throw new Exception ('event name not defined in accordance with the specification'); } else { preg_match("/@Listener\((.*)\)/i", $re->getDocComment(), $eventName); if (empty($eventName)) { Throw new Exception ('event name not defined in accordance with the specification'); } # Registered events Event::register($eventName[1], [$obj, 'handle']); } } } } } ... }
- Вызовите метод сбора событий при запуске Swool
- ColecEvent отвечает за сбор, регистрацию методов в указанных каталогах и пространствах имен
.'/слушатель'
- Просмотрите все файлы в каталоге
- Получите имя файла
- Объединение пространств имен (пространства имен могут быть размещены в файлах конфигурации, таких как Config)
class_exists
Проверьте наличие классаКласс отражения
Отражения и аннотации используются здесь для определения соответствия.getDocComment()
Получение содержимого аннотации- обычный
/@Прослушиватель\((.*)\)/я
Сопоставляю события, которые необходимо отслеживать - реализовать
Событие::регистрация($событие,$обратный вызов)
Регистрация события
Следующий взгляд Событие
Класс:
class Event { public static $events = []; // Event registration /** *@ Param $event event name *@ Param $callback event callback */ public static function register($event, $callback) { $event = strtolower ($event); // case-insensitive if (!isset(self::$events[$event])) { self::$events[$event] = []; } self::$events[$event] = ['callback' => $callback]; } // Event triggering public static function trigger($event, $params = []) { $event = strtolower ($event); // case-insensitive if (isset(self::$events[$event])) { call_user_func(self::$events[$event]['callback'], $params); return true; } return false; } }
Событие
Существует два статических метода: регистрация события и запуск события.- Регистрация событий реализует включение указанных событий в атрибут $event
- Триггер события: Убедитесь, что событие существует,
call_user_func()
Выполните функцию обратного вызова
Посмотрите еще раз, как объявить файл событий:
upgrade('/'); if ($ret) { // Config::get() $data = [ 'method' => 'register', 'serviceName' => "Server", 'ip' => '0.0.0.0', 'port' => 9800, ]; $cli->push(json_encode($data)); // Heart beat management swoole_timer_tick(3000, function () use ($cli) { if ($cli->errCode == 0) { $cli->push('11', WEBSOCKET_OPCODE_PING); } }); } }); } }
- Класс интерфейса должен быть унаследован здесь и должен быть реализован методом
handle ()
, вы можете реализовать его самостоятельно. Метод handle()
Здесь реализована функция, аналогичная Службе регистрации реестра уведомлений.swoole_timer_tick()
Обработка сердцебиения с помощью миллисекундного таймера- Аннотации к документам для рефлекторного захвата
/** * Class StartListener * @package App\Listener * @Listener(start) */
вызов
public function start() { ... # Actively Collect Existing Events Collect Listener Directory $this->collecEvent(); ... Event::trigger('start', ['sss']); }
Спасибо, что посмотрели
Спасибо вам за ваше терпение. Я надеюсь, что это будет полезно для вас. Я также надеюсь, что вы сможете высказать разные мнения и найти более эффективные способы завершить и учиться вместе. Спасибо.