Örnek 1

(Workerman sürümü >=3.3.0 gerektirir)

Worker tabanlı çoklu işlem (dağıtılmış küme) push sistemi, küme yayını, küme bildirimleri.

start_channel.php
Tüm sistemde yalnızca bir adet start_channel servisi dağıtılabilir. 192.168.1.1 üzerinde çalıştığını varsayalım.

<?php
use Workerman\Worker;
require_once __DIR__ . '/vendor/autoload.php';

// Channel sunucusu başlatılır
$channel_server = new Channel\Server('0.0.0.0', 2206);

Worker::runAll();

start_ws.php
Tüm sistemde birden fazla start_ws servisi dağıtılabilir, 192.168.1.2 ve 192.168.1.3 üç sunucusunda çalıştığını varsayalım.

<?php
use Workerman\Worker;
use Workerman\Connection\TcpConnection;
require_once __DIR__ . '/vendor/autoload.php';

// websocket sunucusu
$worker = new Worker('websocket://0.0.0.0:4236');
$worker->count=2;
$worker->name = 'pusher';
$worker->onWorkerStart = function($worker)
{
    // Channel istemcisi Channel sunucusuna bağlanır
    Channel\Client::connect('192.168.1.1', 2206);
    // Kendi işlem kimliğini olay adı olarak kullan
    $event_name = $worker->id;
    // worker->id olayını abone olur ve olay işleyici işlevini kaydeder
    Channel\Client::on($event_name, function($event_data)use($worker){
        $to_connection_id = $event_data['to_connection_id'];
        $message = $event_data['content'];
        if(!isset($worker->connections[$to_connection_id]))
        {
            echo "bağlantı mevcut değil\n";
            return;
        }
        $to_connection = $worker->connections[$to_connection_id];
        $to_connection->send($message);
    });

    // Yayın olayı için abonelik
    $event_name = 'yayın';
    // Yayın olayını aldığında mevcut süreçteki tüm istemci bağlantılarına yayın verisi gönderir
    Channel\Client::on($event_name, function($event_data)use($worker){
        $message = $event_data['content'];
        foreach($worker->connections as $connection)
        {
            $connection->send($message);
        }
    });
};

$worker->onConnect = function(TcpConnection $connection)use($worker)
{
    $msg = "workerID:{$worker->id} connectionID:{$connection->id} bağlandı\n";
    echo $msg;
    $connection->send($msg);
};
Worker::runAll();

start_http.php
Tüm sistemde birden fazla start_http servisi dağıtılabilir, 192.168.1.4 ve 192.168.1.5 üç sunucusunda çalıştığını varsayalım.

<?php
use Workerman\Worker;
use Workerman\Connection\TcpConnection;
require_once __DIR__ . '/vendor/autoload.php';

// http isteğini işlemek için, herhangi bir istemciye veri göndermek için workerID ve connectionID'yi iletmek gerekir
$http_worker = new Worker('http://0.0.0.0:4237');
$http_worker->name = 'publisher';
$http_worker->onWorkerStart = function()
{
    Channel\Client::connect('192.168.1.1', 2206);
};
$http_worker->onMessage = function(TcpConnection $connection, $request)
{
    // workerman4.x 5.x ile uyumlu
    if (!is_array($request)) {
        $get = $request->get();
    }
    $connection->send('ok');
    if(empty($get['content'])) return;
    // Belirli bir worker süreç içindeki belirli bir bağlantıya veri gönderme
    if(isset($get['to_worker_id']) && isset($get['to_connection_id']))
    {
        $event_name = $get['to_worker_id'];
        $to_connection_id = $get['to_connection_id'];
        $content = $get['content'];
        Channel\Client::publish($event_name, array(
           'to_connection_id' => $to_connection_id,
           'content'          => $content
        ));
    }
    // Global yayın verisi
    else
    {
        $event_name = 'yayın';
        $content = $get['content'];
        Channel\Client::publish($event_name, array(
           'content'          => $content
        ));
    }
};

Worker::runAll();

Test

  1. Her bir sunucudaki servisi çalıştırın

  2. İstemci sunucuya bağlanır

Chrome tarayıcısını açın, F12 tuşuna basarak geliştirici konsolunu açın, Console bölümüne şu kodu girin (veya aşağıdaki kodu bir html sayfasında js ile çalıştırın)

//  ws://192.168.1.3:4236 ile de bağlanabilirsiniz
ws = new WebSocket("ws://192.168.1.2:4236");
ws.onmessage = function(e) {
    alert("Sunucudan mesaj alındı:" + e.data);
};
  1. HTTP arayüzünü arayarak veri gönderme

URL'yi şu şekilde ziyaret edin: http://192.168.1.4:4237/?content={$content} veya http://192.168.1.5:4237/?content={$content} tüm istemci bağlantılarına $content verisini göndermek için

URL'yi şu şekilde ziyaret edin: http://192.168.1.4:4237/?to_worker_id={$worker_id}&to_connection_id={$connection_id}&content={$content} veyahttp://192.168.1.5:4237/?to_worker_id={$worker_id}&to_connection_id={$connection_id}&content={$content} belirli bir worker sürecindeki belirli bir istemci bağlantısına $content verisini göndermek için

Not: Test sırasında {$worker_id} {$connection_id} ve {$content} gerçek değerlerle değiştirilmelidir