Резюме
Глядя на название, я не знаю, что хочет сказать автор. Недавно, глядя на 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']);
}Спасибо, что посмотрели
Спасибо вам за ваше терпение. Я надеюсь, что это будет полезно для вас. Я также надеюсь, что вы сможете высказать разные мнения и найти более эффективные способы завершить и учиться вместе. Спасибо.