Gateway API
В примерах $clusterSecret задаётся проверенным общим конфигом из инструкции установки. Не используйте пустые или шаблонные ключи.
Gateway - это класс, который расширяет localzet\Server и обрабатывает клиентские соединения.
Создание экземпляра
Заголовок раздела «Создание экземпляра»use localzet\Cluster\Gateway;
$gateway = new Gateway("websocket://127.0.0.1:7273", [], $clusterSecret);Основные свойства
Заголовок раздела «Основные свойства»Имя Gateway процесса
$gateway->name = 'ChatGateway';Количество процессов Gateway
$gateway->count = 4;IP-адрес локальной машины для внутренней коммуникации
$gateway->lanIp = '127.0.0.1'; // По умолчанию$startPort
Заголовок раздела «$startPort»Начальный порт для внутренней коммуникации между Gateway и Business Worker
$gateway->startPort = 2800; // Каждый процесс использует startPort + id$registerAddress
Заголовок раздела «$registerAddress»Адрес Register сервера
$gateway->registerAddress = '127.0.0.1:1236';// Или массив адресов для репликации$gateway->registerAddress = ['127.0.0.1:1236', '127.0.0.1:1237'];$pingInterval
Заголовок раздела «$pingInterval»Интервал отправки ping сообщений клиентам (секунды)
$gateway->pingInterval = 10; // Отключено, если 0$pingData
Заголовок раздела «$pingData»Данные для ping сообщения
$gateway->pingData = '{"type":"ping"}';$pingNotResponseLimit
Заголовок раздела «$pingNotResponseLimit»Максимальное количество неотвеченных ping перед отключением клиента
$gateway->pingNotResponseLimit = 2; // 0 = отключено$secretKey
Заголовок раздела «$secretKey»Секретный ключ для аутентификации
$gateway->secretKey = $clusterSecret;$router
Заголовок раздела «$router»Функция маршрутизации сообщений к Business Worker
// По умолчанию: привязка client_id к конкретному Business Worker$gateway->router = [Gateway::class, 'routerBind'];
// Случайная маршрутизация$gateway->router = [Gateway::class, 'routerRand'];
// Пользовательская функция$gateway->router = function($server_connections, $client_connection, $cmd, $buffer) { // Вернуть TcpConnection к Business Worker};События
Заголовок раздела «События»onConnect
Заголовок раздела «onConnect»Вызывается при подключении клиента
$gateway->onConnect = function($connection) { // $connection - TcpConnection объект клиента echo "Client connected: " . $connection->id . "\n";};onMessage
Заголовок раздела «onMessage»Вызывается при получении сообщения от клиента
$gateway->onMessage = function($connection, $data) { echo "Message: " . $data . "\n";};onClose
Заголовок раздела «onClose»Вызывается при отключении клиента
$gateway->onClose = function($connection) { echo "Client disconnected: " . $connection->id . "\n";};onBusinessConnected
Заголовок раздела «onBusinessConnected»Вызывается при подключении Business Worker к Gateway
$gateway->onBusinessConnected = function($connection) { echo "Business Worker connected\n";};onBusinessClose
Заголовок раздела «onBusinessClose»Вызывается при отключении Business Worker
$gateway->onBusinessClose = function($connection) { echo "Business Worker disconnected\n";};Методы роутинга
Заголовок раздела «Методы роутинга»routerBind (по умолчанию)
Заголовок раздела «routerBind (по умолчанию)»Привязывает client_id к конкретному Business Worker при первом сообщении. Все последующие сообщения от этого клиента идут к тому же Worker.
routerRand
Заголовок раздела «routerRand»Случайная маршрутизация - каждый раз выбирается случайный Business Worker.
Пример использования
Заголовок раздела «Пример использования»<?phpuse localzet\Server;use localzet\Cluster\Gateway;
require_once __DIR__ . '/cluster-config.php';
$gateway = new Gateway("websocket://127.0.0.1:7273");$gateway->name = 'ChatGateway';$gateway->count = 4;$gateway->lanIp = '127.0.0.1';$gateway->startPort = 2800;$gateway->pingInterval = 10;$gateway->pingData = '{"type":"ping"}';$gateway->registerAddress = '127.0.0.1:1236';$gateway->secretKey = 'secret123';
$gateway->onConnect = function($connection) { Server::log('Client connected: ' . $connection->id);};
if (!defined('GLOBAL_START')) { Server::runAll();}Внутренние порты
Заголовок раздела «Внутренние порты»Каждый Gateway процесс создает внутренний порт для связи с Business Worker’ами:
- Процесс с
id = 0:startPort + 0(например, 2800) - Процесс с
id = 1:startPort + 1(например, 2801) - И так далее…
Business Worker’ы подключаются к этим портам для получения событий от клиентов.