API Reference: Connection
Полный справочник по классам соединений в Localzet Server.
Класс TcpConnection
namespace localzet\Server\Connection;
class TcpConnection extends ConnectionInterface
Класс для представления TCP соединения.
Конструктор
__construct()
public function __construct(
    EventInterface $event,
    resource $socket,
    string $remoteAddress = ''
)
Параметры:
$event- EventInterface, цикл событий$socket- resource, файловый дескриптор сокета$remoteAddress- string, адрес клиента в формате "IP:PORT"
Свойства
Идентификаторы
public int $id = 0;              // Уникальный ID соединения
protected int $realId = 0;       // ID для связи с Server
Адреса
protected resource $socket;          // Сокет соединения
protected string $remoteAddress = ''; // Адрес клиента
Протоколы
public string $transport = 'tcp';  // Транспорт (tcp, ssl, udp)
public ?string $protocol = null;   // Протокол прикладного уровня
Буферы и производительность
protected string $sendBuffer = '';      // Буфер отправки
protected string $recvBuffer = '';      // Буфер приема
protected int $currentPackageLength = 0; // Длина ожидаемого пакета
public int $bytesRead = 0;           // Прочитано байт
public int $bytesWritten = 0;         // Записано байт
public int $maxSendBufferSize = 1048576;    // Максимальный размер буфера отправки (1MB)
public int $maxPackageSize = 10485760;      // Максимальный размер пакета (10MB)
Статус
protected int $status = STATUS_ESTABLISHED;
Константы статуса:
public const STATUS_INITIAL = 0;
public const STATUS_CONNECTING = 1;
public const STATUS_ESTABLISHED = 2;
public const STATUS_CLOSING = 4;
public const STATUS_CLOSED = 8;
События
public ?callable $onConnect = null;
public ?callable $onMessage = null;
public ?callable $onClose = null;
public ?callable $onError = null;
public ?callable $onBufferFull = null;
public ?callable $onBufferDrain = null;
public ?callable $onWebSocketConnect = null;
Методы
send()
Отправка данных клиенту.
public function send(mixed $sendBuffer, bool $raw = false): bool|null
Параметры:
$sendBuffer- Данные для отправки (строка, объект Response и т.д.)$raw- Отправлять в сыром виде без кодирования протоколом
Возвращает:
true- Данные отправлены полностьюfalse- Ошибка отправкиnull- Данные добавлены в буфер, отправка асинхронная
Примеры:
// Отправка строки
$connection->send('Hello');
// Отправка HTTP ответа
$connection->send(new Response(200, ['Content-Type' => 'application/json'], json_encode($data)));
// Сырая отправка (без кодирования протоколом)
$connection->send($binaryData, true);
close()
Закрытие соединения.
public function close(mixed $data = null, bool $raw = false): void
Параметры:
$data- Данные для отправки перед закрытием$raw- Отправлять в сыром виде
Пример:
// Закрытие без данных
$connection->close();
// Закрытие с данными
$connection->close('Goodbye');
$connection->close(new Response(403, [], 'Forbidden'));
getRemoteIp()
Получение IP-адреса клиента.
public function getRemoteIp(): string
Возвращает:
IP-адрес клиента (IPv4 или IPv6).
Пример:
$ip = $connection->getRemoteIp();
// "192.168.1.1" или "::1"
getRemotePort()
Получение порта клиента.
public function getRemotePort(): int
Возвращает:
Порт клиента.
Пример:
$port = $connection->getRemotePort();
// 54321
getRemoteAddress()
Получение полного адреса клиента.
public function getRemoteAddress(): string
Возвращает:
Адрес в формате "IP:PORT".
Пример:
$address = $connection->getRemoteAddress();
// "192.168.1.1:54321"
getLocalIp()
Получение локального IP-адреса сервера.
public function getLocalIp(): string
Возвращает:
IP-адрес сервера на стороне соединения.
getLocalPort()
Получение локального порта сервера.
public function getLocalPort(): int
Возвращает:
Порт сервера.
getLocalAddress()
Получение полного локального адреса.
public function getLocalAddress(): string
Возвращает:
Адрес в формате "IP:PORT".
isIpV4()
Проверка, является ли адрес IPv4.
public function isIpV4(): bool
Возвращает:
true если адрес IPv4, иначе false.
isIpV6()
Проверка, является ли адрес IPv6.
public function isIpV6(): bool
Возвращает:
true если адрес IPv6, иначе false.
getSendBufferQueueSize()
Получение размера буфера отправки.
public function getSendBufferQueueSize(): int
Возвращает:
Размер буфера отправки в байтах.
Пример:
$bufferSize = $connection->getSendBufferQueueSize();
if ($bufferSize > 0) {
    echo "В буфере отправки: $bufferSize байт\n";
}
getRecvBufferQueueSize()
Получение размера буфера приема.
public function getRecvBufferQueueSize(): int
Возвращает:
Размер буфера приема в байтах.
pauseRecv()
Приостановка приема данных.
public function pauseRecv(): void
Описание:
Временно приостанавливает прием данных. Полезно при переполнении буфера отправки.
Пример:
$connection->onBufferFull = function($connection) {
    $connection->pauseRecv(); // Приостанавливаем прием до освобождения буфера
};
resumeRecv()
Возобновление приема данных.
public function resumeRecv(): void
Пример:
$connection->onBufferDrain = function($connection) {
    $connection->resumeRecv(); // Возобновляем прием после освобождения буфера
};
pipe()
Перенаправление данных в другое соединение.
public function pipe(TcpConnection $dest, bool $raw = false): void
Параметры:
$dest- Целевое соединение для перенаправления данных$raw- Отправлять в сыром виде
Описание:
Все данные из текущего соединения автоматически отправляются в целевое.
Пример:
// Перенаправление данных клиента на другой сервер
$clientConnection->pipe($serverConnection);
// Все данные от клиента пойдут на сервер
Статические свойства
Статистика
public static array $statistics = [
    'connection_count' => 0,  // Общее количество соединений
    'total_request' => 0,     // Общее количество запросов
    'throw_exception' => 0,   // Количество исключений
    'send_fail' => 0,         // Неудачных отправок
];
Пример:
$stats = TcpConnection::$statistics;
echo "Активных соединений: {$stats['connection_count']}\n";
echo "Всего запросов: {$stats['total_request']}\n";
Все соединения
public static array $connections = [];
Пример:
// Отправка сообщения всем соединениям
foreach (TcpConnection::$connections as $connection) {
    $connection->send('Broadcast message');
}
Настройки по умолчанию
public static int $defaultMaxSendBufferSize = 1048576;  // 1MB
public static int $defaultMaxPackageSize = 10485760;    // 10MB
Пример изменения:
// Увеличение размера буфера для всех новых соединений
TcpConnection::$defaultMaxSendBufferSize = 2097152; // 2MB
Константы
Статусы
public const STATUS_INITIAL = 0;
public const STATUS_CONNECTING = 1;
public const STATUS_ESTABLISHED = 2;
public const STATUS_CLOSING = 4;
public const STATUS_CLOSED = 8;
public const STATUS_TO_STRING = [
    self::STATUS_INITIAL => 'INITIAL',
    self::STATUS_CONNECTING => 'CONNECTING',
    self::STATUS_ESTABLISHED => 'ESTABLISHED',
    self::STATUS_CLOSING => 'CLOSING',
    self::STATUS_CLOSED => 'CLOSED',
];
Буферы
public const READ_BUFFER_SIZE = 87380;              // Размер буфера чтения
public const MAX_CACHE_STRING_LENGTH = 2048;       // Максимальная длина для кеша
public const MAX_CACHE_SIZE = 512;                  // Максимальный размер кеша
public const TCP_KEEPALIVE_INTERVAL = 55;           // Интервал keepalive
Примеры использования
Пример 1: Обработка соединения
$server->onConnect = function(TcpConnection $connection) {
    echo "Подключение: " . $connection->getRemoteAddress() . "\n";
    
    // Установка таймаута
    Timer::delay(30.0, function() use ($connection) {
        if ($connection->status === TcpConnection::STATUS_ESTABLISHED) {
            $connection->close('Timeout');
        }
    });
};
$server->onMessage = function(TcpConnection $connection, $data) {
    // Отправка эха
    $connection->send('Echo: ' . $data);
};
$server->onClose = function(TcpConnection $connection) {
    echo "Отключение: " . $connection->getRemoteAddress() . "\n";
};
Пример 2: Управление буфером
$connection->onBufferFull = function(TcpConnection $connection) {
    echo "Буфер полон: " . $connection->getSendBufferQueueSize() . " байт\n";
    $connection->pauseRecv(); // Приостанавливаем прием
};
$connection->onBufferDrain = function(TcpConnection $connection) {
    echo "Буфер освобожден\n";
    $connection->resumeRecv(); // Возобновляем прием
};
Пример 3: Мониторинг соединения
$server->onConnect = function(TcpConnection $connection) {
    $connection->context->startTime = microtime(true);
    $connection->context->bytesReceived = 0;
};
$server->onMessage = function(TcpConnection $connection, $data) {
    $connection->context->bytesReceived += strlen($data);
    
    // Проверка лимита данных
    if ($connection->context->bytesReceived > 10485760) { // 10MB
        $connection->close('Data limit exceeded');
    }
};
$server->onClose = function(TcpConnection $connection) {
    $duration = microtime(true) - $connection->context->startTime;
    echo sprintf(
        "Соединение закрыто. Длительность: %.2fs, Получено: %d байт\n",
        $duration,
        $connection->context->bytesReceived
    );
};

