Файл ServerEventsObserverService.php в Cotonti

Файл ServerEventsObserverService.php в движке Cotonti CMF реализует сервис, отвечающий за управление наблюдателями серверных событий. Его основное назначение — отслеживание состояния пользователей, их активности и управления сессиями, связанными с событиями на сервере в реальном времени.

Основные функции класса ServerEventsObserverService:

  1. Проверка подключения пользователя:

    • Метод isConnected(int $userId, ?string $token): bool проверяет, активно ли соединение пользователя с сервером, основываясь на существовании записи о текущем наблюдателе для этого пользователя и его токена.
    • Для этого используется репозиторий ServerEventsObserversRepository, который позволяет проверить количество сессий для данного пользователя. Если сессия активна (сессий больше 0), то считается, что пользователь подключен.
  2. Регистрация наблюдателя:

    • Метод register(int $userId): ?string регистрирует нового наблюдателя (сессию пользователя) на сервере. Если наблюдатель для данного пользователя уже существует, обновляется его время последнего обновления. Если нет — создается новый наблюдатель, и сохраняются данные, такие как ID пользователя, токен, время создания и обновления.
  3. Установка ID последнего события:

    • Метод setLastEventId(string $token, int $eventId): bool устанавливает ID последнего обработанного события для данного наблюдателя (по его токену).
  4. Удаление наблюдателя:

    • Метод remove(int $userId, string $token): void удаляет наблюдателя по ID пользователя и токену. Также удаляются связанные с этим наблюдателем события.
  5. Очистка устаревших наблюдателей:

    • Метод clearOld(): void удаляет записи о наблюдателях, которые стали устаревшими, исходя из времени их последнего обновления, и очищает устаревшие события.
  6. Получение токена текущего пользователя:

    • Метод getTokenForCurrentUser(): string возвращает уникальный токен для текущего пользователя на основе ID сессии.

Общая суть кода:

Класс служит для управления состоянием и сессиями пользователей, которые участвуют в обработке событий на сервере. Он предоставляет методы для регистрации, обновления, удаления наблюдателей и очистки устаревших данных. Это позволяет системе отслеживать активность пользователей в реальном времени и обеспечивать корректную обработку серверных событий для активных сессий.

Примечания:

  • Используется репозиторий ServerEventsObserversRepository, который взаимодействует с базой данных для выполнения операций с наблюдателями.
  • Реализуется синглтон через трейд GetInstanceTrait, что позволяет использовать единственный экземпляр этого сервиса.
  • Этот сервис также взаимодействует с другими частями системы, такими как ServerEventService, для управления связанными сессиями и событиями.

Таким образом, ServerEventsObserverService играет ключевую роль в мониторинге и управлении сессиями для обработки серверных событий в реальном времени в рамках Cotonti CMF.

/system/serverEvents/ServerEventsObserverService.php

 

 

<?php

declare(strict_types=1); // Задание строгих типов для параметров и возвратов

namespace cot\serverEvents; // Указывает пространство имен для класса

use Cot; // Подключение глобального объекта Cot
use cot\serverEvents\repositories\ServerEventsObserversRepository; // Подключение репозитория для наблюдателей событий сервера
use cot\traits\GetInstanceTrait; // Подключение трейта для синглтона
use BadMethodCallException; // Исключение для неверного вызова метода

defined('COT_CODE') or die('Wrong URL'); // Проверка, что код вызывается из правильного контекста

/**
 * Server Event observer service
 * Сервис для наблюдателей серверных событий
 * @package Cotonti
 * @copyright (c) Cotonti Team
 * @license https://github.com/Cotonti/Cotonti/blob/master/License.txt
 */
class ServerEventsObserverService // Класс для обслуживания наблюдателей событий сервера
{
    use GetInstanceTrait; // Использование трейта для реализации синглтона

    /**
     * Проверка, подключен ли пользователь.
     *
     * После выбора активного пользователя из базы данных, можно сохранить текущее время в таблице наблюдателей
     * в поле 'last_seen'. Или отправить пинг клиенту.
     * Но это не обязательно. Если мы отключим активного пользователя, браузер автоматически переподключится, если потребуется.
     */
    public function isConnected(int $userId, ?string $token): bool // Метод для проверки подключения пользователя
    {
        $sessionsCount = ServerEventsObserversRepository::getInstance()->getCountByUserId($userId, $token); // Получаем количество сессий для пользователя
        return $sessionsCount > 0; // Если сессии существуют, возвращаем true
    }

    public function register(int $userId): ?string // Метод для регистрации нового наблюдателя
    {
        if ($userId === 0) { // Если ID пользователя равен 0
            throw new BadMethodCallException(); // Генерируем исключение
        }

        $token = $this->getTokenForCurrentUser(); // Получаем токен для текущего пользователя

        $nowDate = date('Y-m-d H:i:s', Cot::$sys['now']); // Получаем текущую дату и время

        $existingObserver = ServerEventsObserversRepository::getInstance()->getByUserId($userId, $token); // Проверяем, существует ли уже наблюдатель для этого пользователя
        if ($existingObserver !== null) { // Если наблюдатель существует
            Cot::$db->update( // Обновляем данные наблюдателя
                Cot::$db->server_events_observers, // Указываем таблицу
                ['updated_at' => $nowDate], // Обновляем поле с датой
                "id = {$existingObserver['id']}" // Указываем условие для обновления
            );
            return $existingObserver['token']; // Возвращаем токен существующего наблюдателя
        }

        // Если наблюдатель не найден, создаем нового
        $data = [
            'user_id' => $userId, // ID пользователя
            'token' => $token, // Токен
            'created_at' => $nowDate, // Дата создания
            'updated_at' => $nowDate, // Дата последнего обновления
            'last_event_id' => 0, // ID последнего события
        ];

        Cot::$db->insert(Cot::$db->server_events_observers, $data); // Вставляем нового наблюдателя в таблицу

        return $token; // Возвращаем токен нового наблюдателя
    }

    public function setLastEventId(string $token, int $eventId): bool // Метод для установки ID последнего события
    {
        $result = Cot::$db->update( // Обновляем данные наблюдателя в базе
            Cot::$db->server_events_observers, // Указываем таблицу
            ['last_event_id' => $eventId], // Обновляем поле с ID последнего события
            'token = :token', // Условие для поиска по токену
            ['token' => $token] // Параметры для запроса
        );

        return $result > 0; // Если обновление успешно, возвращаем true
    }

    public function remove(int $userId, string $token): void // Метод для удаления наблюдателя
    {
        if ($userId === 0) { // Если ID пользователя равен 0
            throw new BadMethodCallException(); // Генерируем исключение
        }

        Cot::$db->delete( // Удаляем наблюдателя из базы
            Cot::$db->server_events_observers, // Указываем таблицу
            'user_id = :userId AND token = :token', // Условие для удаления
            ['userId' => $userId, 'token' => $token] // Параметры для запроса
        );

        ServerEventService::getInstance()->deleteByUserId($userId); // Удаляем события для пользователя
    }

    public function clearOld(): void // Метод для очистки устаревших наблюдателей
    {
        $expireDate = date('Y-m-d H:i:s', time() - ServerEventsDictionary::OBSERVER_EXPIRE_IN); // Вычисляем дату устаревших наблюдателей

        Cot::$db->delete( // Удаляем наблюдателей, чьи данные устарели
            Cot::$db->server_events_observers, // Указываем таблицу
            "updated_at <= '{$expireDate}'" // Условие для удаления по времени
        );

        ServerEventService::getInstance()->clearExpired(); // Очищаем события, которые устарели
    }

    public function getTokenForCurrentUser(): string // Метод для получения токена текущего пользователя
    {
        return session_id(); // Возвращаем ID сессии как токен
    }
}

 

 

5 минут чтения Administrator

Комментарии (0)

Комментарии отсутствуют
Добавление комментариев доступно только зарегистрированным пользователям

Автор контента

Administrator

Оффлайн

Administrator

Последняя авторизация: 05.07.2026 18:32

  • Страница размещена: 27.01.2025 23:39
  • Последнее обновление: 27.01.2025 23:39