phpsoftbox / broadcaster
Broadcaster component for the PhpSoftBox framework (Pushr)
Requires
- php: ^8.5
- phpsoftbox/config: ^1.0
- psr/clock: ^1.0
- psr/container: ^2.0
- psr/http-message: ^2.0
Requires (Dev)
- phpsoftbox/cli-app: ^1.0
- phpsoftbox/cs-fixer: ^1.2.2
- phpunit/phpunit: ^13.3
Suggests
- phpsoftbox/cli-app: Required for pushr:* commands (server, signatures, channel auth).
Provides
None
Conflicts
None
Replaces
None
This package is auto-updated.
Last update: 2026-09-30 11:21:50 UTC
README
About
phpsoftbox/broadcaster — компонент для запуска WebSocket сервера и обмена сообщениями между сервисами. Драйвер Pushr реализует собственный протокол с авторизацией по app_id и signature.
Ключевые свойства:
- сервер
PushrServer(WebSocket) - клиент
PushrClientдля публикации/подписки - подписи
PushrSignature - подписи каналов
PushrChannelAuth - реестр каналов
ChannelRegistry - поддержка каналов (rooms), включая приватные
- keepalive: ping простаивающим соединениям (
pingInterval, 25 с), закрытие молчащих дольшеidleTimeout(60 с), прикладной ping{"type":"ping"}→{"type":"pong"}— см. Server
Quick Start
Запуск сервера:
use PhpSoftBox\Broadcaster\Pushr\PushrAppRegistry; use PhpSoftBox\Broadcaster\Pushr\PushrServer; $registry = new PushrAppRegistry([ 'app-1' => 'secret-1', ]); $server = new PushrServer($registry, host: '0.0.0.0', port: 8080); $server->run();
Сервер закрывает соединения, не присылающие ни одного кадра дольше idleTimeout (60 с); браузеры и стандартные
WebSocket-библиотеки держат соединение, отвечая на ping сервера. idleTimeout: 0 (--idle-timeout=0) отключает
закрытие.
Подключение клиентом:
use PhpSoftBox\Broadcaster\Pushr\PushrClient; $client = new PushrClient('127.0.0.1', 8080, 'app-1', 'secret-1'); $client->connect(); $client->subscribe('news'); $client->publish('news', 'message', ['text' => 'hello']);
Публикация из PHP-кода без постоянного подключения:
use PhpSoftBox\Broadcaster\Pushr\PushrPublisher; use PhpSoftBox\Broadcaster\Pushr\PushrPublisherOptions; $publisher = new PushrPublisher( 'app-1', 'secret-1', '127.0.0.1', 8080, options: new PushrPublisherOptions( connectTimeoutSeconds: 0.5, handshakeTimeoutSeconds: 0.5, writeTimeoutSeconds: 0.5, ), ); $publisher->publish('news', 'message', ['text' => 'hello']); $publisher->publishMany(['news', 'private.user.10'], 'message', ['text' => 'hello']);
PushrClient и PushrPublisher подключаются как публикатор (role=publisher, отдельная подпись из секрета);
браузерные соединения с подписью от /broadcast/connect публиковать не могут — только подписываться.
publishMany() открывает одно соединение для всех каналов. Синхронный publisher
не скрывает ошибки: приложение само решает, должна ли ошибка публикации прервать
операцию. Для гарантированной доставки через очередь или transactional outbox
используйте DeferredPushrPublisher со своей реализацией
PushrPublicationDispatcherInterface.