Workerman'da Belirli Bir İstemciye Veri Gönderme

Worker kullanarak bir sunucu oluşturma, GatewayWorker kullanmadan nasıl belirli bir kullanıcıya mesaj gönderebiliriz?

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

// 1234 portunu dinleyen bir worker konteyneri başlat
$worker = new Worker('websocket://workerman.net:1234');
// ==== burada işlem sayısı kesinlikle 1 olarak ayarlanmalıdır ====
$worker->count = 1;
// uid ile bağlantılar arasındaki eşleşmeyi saklamak için yeni bir özellik ekleyin (uid kullanıcı kimliği veya istemci benzersiz tanımlayıcısıdır)
$worker->uidConnections = array();
// Bir istemciden mesaj geldiğinde gerçekleştirilecek geri çağırma fonksiyonu
$worker->onMessage = function(TcpConnection $connection, $data)
{
    global $worker;
    // Mevcut istemcinin doğrulanıp doğrulanmadığını, yani uid'nin ayarlanıp ayarlanmadığını kontrol et
    if(!isset($connection->uid))
    {
       // Doğrulanmadıysa, ilk paketi uid olarak kabul et (burada göstermek için gerçek doğrulama yapmadık)
       $connection->uid = $data;
       /* uid ile bağlantı arasındaki eşleşmeyi saklayın, böylece uid ile bağlantıyı kolayca bulabilirsiniz,
        * belirli uid'ye veri göndermeyi sağlayın
        */
       $worker->uidConnections[$connection->uid] = $connection;
       return $connection->send('giriş başarılı, uid'niz ' . $connection->uid);
    }
    // Diğer mantık, belirli bir uid'ye gönderme veya genel yayın
    // Varsayılan mesaj formatı uid:message olup, uid'ye message gönderir
    // uid all olduğunda genel yayın
    list($recv_uid, $message) = explode(':', $data);
    // Genel yayın
    if($recv_uid == 'all')
    {
        broadcast($message);
    }
    // Belirli bir uid'ye gönder
    else
    {
        sendMessageByUid($recv_uid, $message);
    }
};

// Bir istemci bağlantısı kapandığında
$worker->onClose = function(TcpConnection $connection)
{
    global $worker;
    if(isset($connection->uid))
    {
        // Bağlantı kapandığında eşleşmeyi kaldır
        unset($worker->uidConnections[$connection->uid]);
    }
};

// Tüm doğrulanmış kullanıcılara veri göndermek
function broadcast($message)
{
   global $worker;
   foreach($worker->uidConnections as $connection)
   {
        $connection->send($message);
   }
}

// Belirli bir uid'ye veri göndermek
function sendMessageByUid($uid, $message)
{
    global $worker;
    if(isset($worker->uidConnections[$uid]))
    {
        $connection = $worker->uidConnections[$uid];
        $connection->send($message);
    }
}

// Tüm worker'ları çalıştır (aslında şu anda sadece bir tane tanımlandı)
Worker::runAll();

Açıklama:

Yukarıdaki örnek, uid'ye veri göndermeyi desteklemektedir, tek işlem olmasına rağmen 100.000 çevrimiçi kullanıcıyı desteklemek mümkündür.

Not: Bu örnek yalnızca tek işlem desteklemektedir, yani $worker->count kesinlikle 1 olmalıdır. Çoklu işlem veya sunucu kümesi desteği gerektiğinde, işlem arasındaki iletişimi sağlamak için Channel bileşeni kullanmanız gerekir; geliştirilmesi de oldukça basittir, Channel bileşeni ile küme yayını örneği bölümüne bakabilirsiniz.

Eğer başka bir sistemde istemciye mesaj göndermek isterseniz, Başka Projelerde Yayınlama bölümüne bakabilirsiniz.