Как транслировать (массово отправлять) данные
Пример (периодическая трансляция)
use Workerman\Worker;
use Workerman\Timer;
require_once __DIR__ . '/vendor/autoload.php';
$worker = new Worker('websocket://0.0.0.0:2020');
// В этом примере количество процессов должно быть равно 1
$worker->count = 1;
// При запуске процесса устанавливается таймер, который периодически отправляет данные всем подключённым клиентам
$worker->onWorkerStart = function($worker)
{
// Периодически, каждые 10 секунд
Timer::add(10, function()use($worker)
{
// Обходит все клиентские подключения текущего процесса и отправляет текущее время на сервере
foreach($worker->connections as $connection)
{
$connection->send(time());
}
});
};
// Запуск worker
Worker::runAll();
Пример (групповой чат)
use Workerman\Worker;
use Workerman\Timer;
use Workerman\Connection\TcpConnection;
require_once __DIR__ . '/vendor/autoload.php';
$worker = new Worker('websocket://0.0.0.0:2020');
// В этом примере количество процессов должно быть равно 1
$worker->count = 1;
// Когда клиент отправляет сообщение, оно транслируется другим пользователям
$worker->onMessage = function(TcpConnection $connection, $message)use($worker)
{
foreach($worker->connections as $connection)
{
$connection->send($message);
}
};
// Запуск worker
Worker::runAll();
Описание:
Однопроцессный режим:
В приведённых примерах можно использовать только один процесс ($worker->count=1), потому что при использовании нескольких процессов несколько клиентов могут подключаться к разным процессам, и клиенты в разных процессах изолированы друг от друга, то есть процесс A не может непосредственно управлять объектом подключения клиента процесса B для отправки данных. (Чтобы это реализовать, потребуется межпроцессное взаимодействие, например, можно использовать компонент Channel, например, пример - массовая отправка, пример - отправка по группам).
Рекомендуется использовать GatewayWorker
Фреймворк GatewayWorker, разработанный на основе Workerman, предоставляет более удобные механизмы отправки, включая мультивещание и широковещательную передачу, поддерживает многопроцессную и даже многосерверную развертку. Если необходимо отправлять данные клиенту, рекомендуется использовать фреймворк GatewayWorker.
Адрес руководства GatewayWorker: https://doc2.workerman.net