Gateway API
В примерах $clusterSecret задаётся проверенным общим конфигом из инструкции установки. Не используйте пустые или шаблонные ключи.
Gateway - это класс, который расширяет localzet\Server и обрабатывает клиентские соединения.
Создание экземпляра
Section titled “Создание экземпляра”use localzet\Cluster\Gateway;
$gateway = new Gateway("websocket://127.0.0.1:7273", [], $clusterSecret);Основные свойства
Section titled “Основные свойства”Имя Gateway процесса
$gateway->name = 'ChatGateway';$count
Section titled “$count”Количество процессов Gateway
$gateway->count = 4;$lanIp
Section titled “$lanIp”IP-адрес локальной машины для внутренней коммуникации
$gateway->lanIp = '127.0.0.1'; // По умолчанию$startPort
Section titled “$startPort”Начальный порт для внутренней коммуникации между Gateway и Business Worker
$gateway->startPort = 2800; // Каждый процесс использует startPort + id$registerAddress
Section titled “$registerAddress”Адрес Register сервера
$gateway->registerAddress = '127.0.0.1:1236';// Или массив адресов для репликации$gateway->registerAddress = ['127.0.0.1:1236', '127.0.0.1:1237'];$pingInterval
Section titled “$pingInterval”Интервал отправки ping сообщений клиентам (секунды)
$gateway->pingInterval = 10; // Отключено, если 0$pingData
Section titled “$pingData”Данные для ping сообщения
$gateway->pingData = '{"type":"ping"}';$pingNotResponseLimit
Section titled “$pingNotResponseLimit”Максимальное количество неотвеченных ping перед отключением клиента
$gateway->pingNotResponseLimit = 2; // 0 = отключено$secretKey
Section titled “$secretKey”Секретный ключ для аутентификации
$gateway->secretKey = $clusterSecret;$router
Section titled “$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};События
Section titled “События”onConnect
Section titled “onConnect”Вызывается при подключении клиента
$gateway->onConnect = function($connection) { // $connection - TcpConnection объект клиента echo "Client connected: " . $connection->id . "\n";};onMessage
Section titled “onMessage”Вызывается при получении сообщения от клиента
$gateway->onMessage = function($connection, $data) { echo "Message: " . $data . "\n";};onClose
Section titled “onClose”Вызывается при отключении клиента
$gateway->onClose = function($connection) { echo "Client disconnected: " . $connection->id . "\n";};onBusinessConnected
Section titled “onBusinessConnected”Вызывается при подключении Business Worker к Gateway
$gateway->onBusinessConnected = function($connection) { echo "Business Worker connected\n";};onBusinessClose
Section titled “onBusinessClose”Вызывается при отключении Business Worker
$gateway->onBusinessClose = function($connection) { echo "Business Worker disconnected\n";};Методы роутинга
Section titled “Методы роутинга”routerBind (по умолчанию)
Section titled “routerBind (по умолчанию)”Привязывает client_id к конкретному Business Worker при первом сообщении. Все последующие сообщения от этого клиента идут к тому же Worker.
routerRand
Section titled “routerRand”Случайная маршрутизация - каждый раз выбирается случайный Business Worker.
Пример использования
Section titled “Пример использования”<?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();}Внутренние порты
Section titled “Внутренние порты”Каждый Gateway процесс создает внутренний порт для связи с Business Worker’ами:
- Процесс с
id = 0:startPort + 0(например, 2800) - Процесс с
id = 1:startPort + 1(например, 2801) - И так далее…
Business Worker’ы подключаются к этим портам для получения событий от клиентов.