مثال 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
        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\Client حدث إرسال الرسالة إلى المجموعة لجميع عمليات جميع الخوادم
                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();

اختبار (افترض أن كل شيء يعمل على localhost 127.0.0.1)

  1. تشغيل الخادم
    
    php start.php start
    Workerman[del.php] تبدأ في وضع DEBUG
    ----------------------- WORKERMAN -----------------------------
    إصدار Workerman: 3.4.2          إصدار PHP: 7.1.3
    ------------------------ WORKERS -------------------------------
    المستخدم          العامل         استمع                    العمليات الحالة
    liliang       ChannelServer  frame://0.0.0.0:2206       1         [OK] 
    liliang       لا شيء           websocket://0.0.0.0:1234   12        [OK] 
    ----------------------------------------------------------------
    اضغط Ctrl-C للخروج. تم البدء بنجاح.

2. اتصال العميل بالخادم

افتح متصفح Chrome، واضغط على F12 لفتح وحدة التحكم، وأدخل في عمود Console (أو ضع الكود أدناه في صفحة HTML لتشغيله باستخدام JS)

```javascript
// افترض أن عنوان IP للخادم هو 127.0.0.1، يرجى تغييره إلى عنوان IP الحقيقي للخادم عند الاختبار
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":"هذا هو الرسالة"}');
};