Gateway API

Gateway - это класс, который расширяет localzet\Server и обрабатывает клиентские соединения.

Создание экземпляра

use localzet\Cluster\Gateway;

$gateway = new Gateway("Websocket://0.0.0.0:7273", [], 'your-secret-key');

Основные свойства

$name

Имя Gateway процесса

$gateway->name = 'ChatGateway';

$count

Количество процессов Gateway

$gateway->count = 4;

$lanIp

IP-адрес локальной машины для внутренней коммуникации

$gateway->lanIp = '127.0.0.1'; // По умолчанию

$startPort

Начальный порт для внутренней коммуникации между Gateway и Business Worker

$gateway->startPort = 2800; // Каждый процесс использует startPort + id

$registerAddress

Адрес Register сервера

$gateway->registerAddress = '127.0.0.1:1236';
// Или массив адресов для репликации
$gateway->registerAddress = ['127.0.0.1:1236', '127.0.0.1:1237'];

$pingInterval

Интервал отправки ping сообщений клиентам (секунды)

$gateway->pingInterval = 10; // Отключено, если 0

$pingData

Данные для ping сообщения

$gateway->pingData = '{"type":"ping"}';

$pingNotResponseLimit

Максимальное количество неотвеченных ping перед отключением клиента

$gateway->pingNotResponseLimit = 2; // 0 = отключено

$secretKey

Секретный ключ для аутентификации

$gateway->secretKey = 'your-secret-key-here';

$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

Вызывается при подключении клиента

$gateway->onConnect = function($connection) {
    // $connection - TcpConnection объект клиента
    echo "Client connected: " . $connection->id . "\n";
};

onMessage

Вызывается при получении сообщения от клиента

$gateway->onMessage = function($connection, $data) {
    echo "Message: " . $data . "\n";
};

onClose

Вызывается при отключении клиента

$gateway->onClose = function($connection) {
    echo "Client disconnected: " . $connection->id . "\n";
};

onBusinessConnected

Вызывается при подключении Business Worker к Gateway

$gateway->onBusinessConnected = function($connection) {
    echo "Business Worker connected\n";
};

onBusinessClose

Вызывается при отключении Business Worker

$gateway->onBusinessClose = function($connection) {
    echo "Business Worker disconnected\n";
};

Методы роутинга

routerBind (по умолчанию)

Привязывает client_id к конкретному Business Worker при первом сообщении. Все последующие сообщения от этого клиента идут к тому же Worker.

routerRand

Случайная маршрутизация - каждый раз выбирается случайный Business Worker.

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

<?php
use localzet\Server;
use localzet\Cluster\Gateway;

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

$gateway = new Gateway("Websocket://0.0.0.0: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'ы подключаются к этим портам для получения событий от клиентов.