Client API

Client API позволяет внешним приложениям взаимодействовать с Cluster для отправки сообщений клиентам и управления соединениями.

Настройка

use localzet\Cluster\Client;

Client::$registerAddress = '127.0.0.1:1236';
Client::$secretKey = 'your-secret-key-here';
Client::$connectTimeout = 3;
Client::$persistentConnection = false;

Отправка сообщений

Отправить клиенту

Client::sendToClient($client_id, $message, $raw = false);

Параметры:

  • $client_id - ID клиента
  • $message - Сообщение для отправки
  • $raw - Отправить как raw данные (без кодирования протоколом)

Пример:

Client::sendToClient('00000000000000000001', 'Hello!');

Отправить всем клиентам

Client::sendToAll($message, $client_id_array = null, $exclude_client_id = null, $raw = false);

Пример:

// Всем клиентам
Client::sendToAll('Broadcast message');

// Списку клиентов
Client::sendToAll('Group message', ['client1', 'client2']);

// Всем кроме некоторых
Client::sendToAll('Message', null, ['client1']);

Отправить по UID

Client::sendToUid($uid, $message, $raw = false);

Пример:

// Одному пользователю
Client::sendToUid('user123', 'Hello!');

// Нескольким пользователям
Client::sendToUid(['user1', 'user2'], 'Group notification');

Отправить группе

Client::sendToGroup($group, $message, $exclude_client_id = null, $raw = false);

Пример:

// Всем в группе
Client::sendToGroup('room_1', 'New message in room');

// Всем в группе кроме отправителя
Client::sendToGroup('room_1', $message, [$sender_client_id]);

Управление группами

Добавить в группу

Client::joinGroup($client_id, $group);

Удалить из группы

Client::leaveGroup($client_id, $group);

Распустить группу

Client::ungroup($group);

Пример:

// Добавить пользователя в комнату чата
Client::joinGroup($client_id, 'chat_room_1');

// Удалить из комнаты
Client::leaveGroup($client_id, 'chat_room_1');

// Распустить комнату
Client::ungroup('chat_room_1');

Управление UID

Привязать UID

Client::bindUid($client_id, $uid);

Отвязать UID

Client::unbindUid($client_id, $uid);

Пример:

// После успешной аутентификации
Client::bindUid($client_id, $user_id);

// При выходе пользователя
Client::unbindUid($client_id, $user_id);

Управление сессиями

Получить сессию

$session = Client::getSession($client_id);
// Возвращает массив или null, если клиент не найден

Установить сессию

Client::setSession($client_id, ['key' => 'value']);
// Полная замена сессии

Обновить сессию

Client::updateSession($client_id, ['new_key' => 'value']);
// Слияние с существующей сессией

Пример:

// Получить данные пользователя
$session = Client::getSession($client_id);
$userId = $session['user_id'] ?? null;

// Обновить данные
Client::updateSession($client_id, [
    'last_active' => time(),
    'message_count' => 100
]);

Проверка статуса

Проверить онлайн статус

$isOnline = Client::isOnline($client_id);
// Возвращает 0 или 1

Проверить онлайн по UID

$isOnline = Client::isUidOnline($uid);
// Возвращает 0 или 1

Получить client_id по UID

$client_ids = Client::getClientIdByUid($uid);
// Возвращает массив client_id (один пользователь может иметь несколько соединений)

Получение информации

Получить список всех клиентов

$allClients = Client::getAllClientIdList();
// Возвращает массив всех client_id

Получить количество клиентов

$count = Client::getAllClientCount();
// Общее количество подключенных клиентов

Получить клиентов группы

$clients = Client::getClientIdListByGroup($group);
// Возвращает массив client_id в группе

Получить количество в группе

$count = Client::getClientCountByGroup($group);

Получить все сессии

$sessions = Client::getAllClientSessions();
// Возвращает массив: client_id => session

Получить сессии группы

$sessions = Client::getClientSessionsByGroup($group);

Закрытие соединений

Закрыть клиента

Client::closeClient($client_id, $message = null);
// Отправляет сообщение и закрывает соединение

Уничтожить соединение

Client::destoryClient($client_id);
// Немедленное закрытие без отправки сообщения

Пример использования

<?php
require_once __DIR__ . '/vendor/autoload.php';

use localzet\Cluster\Client;

// Настройка
Client::$registerAddress = '127.0.0.1:1236';
Client::$secretKey = 'secret123';

// Отправить уведомление пользователю
$userId = 12345;
if (Client::isUidOnline($userId)) {
    $clientIds = Client::getClientIdByUid($userId);
    foreach ($clientIds as $clientId) {
        Client::sendToClient($clientId, json_encode([
            'type' => 'notification',
            'message' => 'You have a new message!'
        ]));
    }
}

// Отправить сообщение в группу
Client::sendToGroup('chat_room_1', json_encode([
    'type' => 'message',
    'user' => 'Admin',
    'text' => 'Server maintenance in 5 minutes'
]));

// Получить статистику
$totalUsers = Client::getAllClientCount();
$roomUsers = Client::getClientCountByGroup('chat_room_1');
echo "Total: $totalUsers, In room: $roomUsers\n";

Производительность

  • Client API использует синхронные соединения к Gateway
  • Для лучшей производительности используйте persistent connections
  • Множественные запросы можно выполнять параллельно через пул соединений
  • Рекомендуется кешировать списки Gateway адресов