データのブロードキャスト(広報)
例(定期ブロードキャスト)
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プロセスのクライアントconnectionオブジェクトを直接操作してデータを送信することはできません。(これを実現するには、プロセス間通信が必要で、例えばChannelコンポーネントを使用することができます。たとえば、例-クラスタ送信、例-グループ送信)が必要です)。
GatewayWorkerを使用することをお勧めします
Workermanを基に開発されたGatewayWorkerフレームワークは、マルチキャスト、ブロードキャストなどのより便利なプッシュメカニズムを提供し、多プロセスや複数サーバーのデプロイも設定でき、クライアントにデータをプッシュする必要がある場合は、GatewayWorkerフレームワークの使用をお勧めします。
GatewayWorkerマニュアルのURL https://doc2.workerman.net