데이터를 방송(그룹 전송)하는 방법
예제 (정기 방송)
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::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::runAll();
설명:
단일 프로세스:
위 예제는 단일 프로세스 ($worker->count=1)만 가능하며, 다중 프로세스일 경우 여러 클라이언트가 서로 다른 프로세스에 연결될 수 있으므로 프로세스 간의 클라이언트는 격리되어 직접 통신할 수 없습니다. 즉, A 프로세스에서 B 프로세스의 클라이언트 connection 객체에 직접 데이터를 전송할 수 없습니다. (이를 위해서는 프로세스 간 통신이 필요하며, Channel 컴포넌트를 사용할 수 있습니다. 예: 예제-클러스터 전송, 예제-그룹 전송).
GatewayWorker 사용 추천
Workerman을 기반으로 개발된 GatewayWorker 프레임워크는 멀티 전송, 방송 등 더 편리한 푸시 메커니즘을 제공합니다. 여러 프로세스 및 다중 서버 배포를 설정할 수 있으며, 클라이언트에게 데이터를 전송하는 경우 GatewayWorker 프레임워크를 사용하는 것이 좋습니다.
GatewayWorker 매뉴얼 주소 https://doc2.workerman.net