WS — WebSocket-сборка

triangle/ws — экспериментальный WebSocket-first шаблон Triangle на базе Localzet Server. Его код принимает HTTP WebSocket handshake, выбирает маршрут по URL и передаёт текстовые кадры зарегистрированному обработчику. Это отдельный трек; до выбора проверьте, что приложению нужен именно такой lifecycle.

Фактические границы

  • Шаблон по умолчанию запускает один worker. Несколько worker-процессов требуют отдельного механизма общей координации соединений и рассылки.
  • API Connection, автоматические комнаты, session на connection и распределённая рассылка в текущем пакете отсутствуют.
  • Triangle\Ws\App::sendToAll() и sendToGroup() отправляют кадры через серверные соединения текущего процесса. sendToGroup() ограничен URL-путём текущего соединения, а не произвольным именем комнаты.
  • Межпроцессная синхронизация, reconnect и backpressure не предоставляются этим приложением как готовая функция.

WS — экспериментальный трек. Не планируйте горизонтальное масштабирование на основе API, которого нет в коде. Версии компонентов смотрите в матрице совместимости.

Установка и запуск

composer create-project triangle/ws my-ws-app
cd my-ws-app
php master start
 

Шаблон слушает websocket://0.0.0.0:8080 из config/server.php. Для локальной проверки клиент подключается к ws://127.0.0.1:8080.

Обработчик сообщения

WS маршрут регистрируется в исполняемом config/route.php. Сообщение кадра передаётся callback как строка; возвращённое значение отправляется этому соединению:

<?php
 
use Triangle\Router;
use Triangle\Ws\Response;
 
Router::any('/echo', function (?string $message): Response {
    return new Response(200, [], $message ?? '');
});
 

Клиент:

const socket = new WebSocket('ws://127.0.0.1:8080/echo')
socket.onopen = () => socket.send('hello')
socket.onmessage = (event) => console.log(event.data)
 

Для сложных обработчиков изучите Triangle\Ws\App::onWebsocketConnect(), onMessage() и onClose() в triangle/engine-ws: начальный handshake и последующие кадры проходят через route callback с разным содержимым запроса.