Рубрики
Uncategorized

Разделяющий курс “Хождение по пути обучения Скоулза”

Автор оригинала: David Wong.

Резюме

Глядя на название, я не знаю, что хочет сказать автор. Недавно, глядя на 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']);
    }

Спасибо, что посмотрели

Спасибо вам за ваше терпение. Я надеюсь, что это будет полезно для вас. Я также надеюсь, что вы сможете высказать разные мнения и найти более эффективные способы завершить и учиться вместе. Спасибо.