on

(يتطلب إصدار Workerman >= 3.3.0)

void \Channel\Client::on(string $event_name, callback $callback_function)

الاشتراك في حدث $event_name وتسجيل رد الاتصال $callback_function عند حدوث الحدث.

معلمات وظيفة رد الاتصال

$event_name

اسم الحدث المشترك، يمكن أن يكون أي سلسلة.

$callback_function

وظيفة رد الاتصال التي يتم تنشيطها عند حدوث الحدث. نموذج الوظيفة هو callback_function(mixed $event_data) . $event_data هو بيانات الحدث المرسلة عند نشر الحدث (publish).

انتبه:

إذا تم تسجيل وظيفتي رد اتصال لنفس الحدث، فستحجب الوظيفة الأخيرة الوظيفة الأولى.

مثال

عمال متعدد العمليات (خادم متعدد)، عميل واحد يرسل رسالة، يتم بثها إلى جميع العملاء.

start.php

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

// تهيئة خادم Channel
$channel_server = new Channel\Server('0.0.0.0', 2206);

// خادم websocket
$worker = new Worker('websocket://0.0.0.0:4236');
$worker->name = 'websocket';
$worker->count = 6;
// عند بدء تشغيل كل عملية عامل
$worker->onWorkerStart = function($worker)
{
    // عميل Channel يتصل بخادم Channel
    Channel\Client::connect('127.0.0.1', 2206);
    // الاشتراك في حدث broadcast، وتسجيل رد الاتصال للحدث
    Channel\Client::on('broadcast', function($event_data)use($worker){
        // بث الرسائل إلى جميع العملاء في عملية العامل الحالية
        foreach($worker->connections as $connection)
        {
            $connection->send($event_data);
        }
    });
};

$worker->onMessage = function(TcpConnection $connection, $data)
{
   // اعتبار البيانات القادمة من العميل كبيانات حدث
   $event_data = $data;
   // نشر حدث broadcast إلى جميع عمليات العامل
   \Channel\Client::publish('broadcast', $event_data);
};

Worker::runAll();

اختبار

افتح متصفح chrome، اضغط F12 لفتح وحدة التحكم، أدخل في قسم Console (أو ضع الكود أدناه في صفحة HTML واستخدم js لتشغيله).

إعداد الاتصال لتلقي الرسائل

// استبدل 127.0.0.1 بعنوان IP الفعلي الذي يوجد به workerman
ws = new WebSocket("ws://127.0.0.1:4236");
ws.onmessage = function(e) {
    alert("استلام رسالة من الخادم: " + e.data);
};

بث الرسالة

ws.send('hello world');