Файл ServerEventsObserverService.php в Cotonti
Файл ServerEventsObserverService.php в движке Cotonti CMF реализует сервис, отвечающий за управление наблюдателями серверных событий. Его основное назначение — отслеживание состояния пользователей, их активности и управления сессиями, связанными с событиями на сервере в реальном времени.
Основные функции класса ServerEventsObserverService:
-
Проверка подключения пользователя:
- Метод
isConnected(int $userId, ?string $token): boolпроверяет, активно ли соединение пользователя с сервером, основываясь на существовании записи о текущем наблюдателе для этого пользователя и его токена. - Для этого используется репозиторий
ServerEventsObserversRepository, который позволяет проверить количество сессий для данного пользователя. Если сессия активна (сессий больше 0), то считается, что пользователь подключен.
- Метод
-
Регистрация наблюдателя:
- Метод
register(int $userId): ?stringрегистрирует нового наблюдателя (сессию пользователя) на сервере. Если наблюдатель для данного пользователя уже существует, обновляется его время последнего обновления. Если нет — создается новый наблюдатель, и сохраняются данные, такие как ID пользователя, токен, время создания и обновления.
- Метод
-
Установка ID последнего события:
- Метод
setLastEventId(string $token, int $eventId): boolустанавливает ID последнего обработанного события для данного наблюдателя (по его токену).
- Метод
-
Удаление наблюдателя:
- Метод
remove(int $userId, string $token): voidудаляет наблюдателя по ID пользователя и токену. Также удаляются связанные с этим наблюдателем события.
- Метод
-
Очистка устаревших наблюдателей:
- Метод
clearOld(): voidудаляет записи о наблюдателях, которые стали устаревшими, исходя из времени их последнего обновления, и очищает устаревшие события.
- Метод
-
Получение токена текущего пользователя:
- Метод
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 сессии как токен
}
}
Комментарии (0)
Автор контента
Оффлайн
Administrator
Последняя авторизация: 05.07.2026 18:32
- Страница размещена: 27.01.2025 23:39
- Последнее обновление: 27.01.2025 23:39