المثال 1

(متطلبات Workerman >= 3.3.0)

نظام الإرسال المتعدد العملية القائمة على Worker

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

    $channel_server = new Channel\Server('0.0.0.0', 2206);

    $worker = new Worker('websocket://0.0.0.0:1234');
    $worker->count = 8;
    // تعيين مجموعة عرضيات الاتصالات إلى مجموعة
    $group_con_map = array();
    $worker->onWorkerStart = function(){
        // يتصل عميل Channel بخادم القناة
        Channel\Client::connect('127.0.0.1', 2206);

        // استمع إلى حدث إرسال رسالة المجموعة العالمية
        Channel\Client::on('send_to_group', function($event_data){
            $group_id = $event_data['group_id'];
            $message = $event_data['message'];
            global $group_con_map;
            var_dump(array_keys($group_con_map));
            if (isset($group_con_map[$group_id])) {
                foreach ($group_con_map[$group_id] as $con) {
                    $con->send($message);
                }
            }
        });
    };
    $worker->onMessage = function(TcpConnection $con, $data){
        // أضف رسالة المجموعة {"cmd":"add_group", "group_id":"123"}
        // أو قم بإرسال رسالة {"cmd":"send_to_group", "group_id":"123", "message":"هذه هي الرسالة"}
        $data = json_decode($data, true);
        var_dump($data);
        $cmd = $data['cmd'];
        $group_id = $data['group_id'];
        switch($cmd) {
            // انضم إلى مجموعة الاتصال
            case "add_group":
                global $group_con_map;
                // أضف الاتصال إلى مجموعة الاتصال المقابلة
                $group_con_map[$group_id][$con->id] = $con;
                // سجل هذا الاتصال المضاف في أي مجموعات، للسماح بتنظيف group_con_map بيانات المجموعة المقابلة في onClose
                $con->group_id = isset($con->group_id) ? $con->group_id : array();
                $con->group_id[$group_id] = $group_id;
                break;
            // ارسال رسالة إلى المجموعة
            case "send_to_group":
                // ينشر عميل Channel حدث إرسال رسالة المجموعة لجميع العمليات في جميع خوادم
                Channel\Client::publish('send_to_group', array(
                    'group_id'=>$group_id,
                    'message'=>$data['message']
                ));
                break;
        }
    };
    // هنا مهم جدًا، عند إغلاق الاتصال ، يجب حذف الاتصال من بيانات مجموعة العرضيات العالمية، لتجنب تسرب الذاكرة
    $worker->onClose = function(TcpConnection $con){
        global $group_con_map;
        // تحقق من الاتصالات المضافة لجميع المجموعات واحذف بيانات group_con_map المقابلة
        if (isset($con->group_id)) {
            foreach ($con->group_id as $group_id) {
                unset($group_con_map[$group_id][$con->id]);
                if (empty($group_con_map[$group_id])) {
                    unset($group_con_map[$group_id]);
                }
            }
        }
    };

    Worker::runAll();

الاختبار (الافتراضي أن جميع الأجهزة تعمل على 127.0.0.1)

1- تشغيل الخادم

php start.php start
Workerman[del.php] start in DEBUG mode
----------------------- WORKERMAN -----------------------------
Workerman version:3.4.2          PHP version:7.1.3
------------------------ WORKERS -------------------------------
user          worker         listen                    processes status
liliang       ChannelServer  frame://0.0.0.0:2206       1         [OK] 
liliang       none           websocket://0.0.0.0:1234   12        [OK] 
----------------------------------------------------------------
Press Ctrl-C to quit. Start success.

2- توصيل العميل بالخادم

افتح متصفح Chrome، واضغط على F12 لفتح لوحة تحكم التصحيح. في النافذة المنبثقة، ادخل الأمر التالي في الجدول (أو ضع الكود التالي في صفحة HTML وقم بتشغيله باستخدام جافا سكريبت)

// يفترض أن عنوان الخادم هو 127.0.0.1، يرجى تغييره إلى عنوان الخادم الفعلي أثناء التجربة
ws = new WebSocket('ws://127.0.0.1:1234');
ws.onmessage = function(data){console.log(data.data)};
ws.onopen = function() {
    ws.send('{"cmd":"add_group", "group_id":"123"}');
    ws.send('{"cmd":"send_to_group", "group_id":"123", "message":"هذه هي الرسالة"}');
};