Ví dụ 1

(Yêu cầu Workerman phiên bản >= 3.3.0)

Hệ thống đẩy nhóm đa tiến trình dựa trên 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;
    // Mảng ánh xạ nhóm đến kết nối toàn cầu
    $group_con_map = array();
    $worker->onWorkerStart = function(){
        // Kết nối khách hàng Channel đến máy chủ Channel
        Channel\Client::connect('127.0.0.1', 2206);

        // Lắng nghe sự kiện gửi tin nhắn nhóm toàn cầu
        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){
        // Tin nhắn tham gia nhóm {"cmd":"add_group", "group_id":"123"}
        // Hoặc gửi tin nhắn nhóm {"cmd":"send_to_group", "group_id":"123", "message":"Đây là tin nhắn"}
        $data = json_decode($data, true);
        var_dump($data);
        $cmd = $data['cmd'];
        $group_id = $data['group_id'];
        switch($cmd) {
            // Kết nối tham gia nhóm
            case "add_group":
                global $group_con_map;
                // Thêm kết nối vào mảng nhóm tương ứng
                $group_con_map[$group_id][$con->id] = $con;
                // Ghi lại kết nối này đã tham gia những nhóm nào, dễ dàng xóa dữ liệu trong group_con_map khi onclose
                $con->group_id = isset($con->group_id) ? $con->group_id : array();
                $con->group_id[$group_id] = $group_id;
                break;
            // Gửi tin nhắn đến nhóm
            case "send_to_group":
                // Channel\Client phát sóng sự kiện gửi tin nhắn nhóm đến tất cả các tiến trình của tất cả các máy chủ
                Channel\Client::publish('send_to_group', array(
                    'group_id'=>$group_id,
                    'message'=>$data['message']
                ));
                break;
        }
    };
    // Điều này rất quan trọng, khi kết nối bị đóng, xóa kết nối khỏi dữ liệu nhóm toàn cầu để tránh rò rỉ bộ nhớ
    $worker->onClose = function(TcpConnection $con){
        global $group_con_map;
        // Duyệt qua tất cả các nhóm mà kết nối đã tham gia, xóa dữ liệu tương ứng khỏi 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();

Kiểm tra (Giả định tất cả đều chạy trên máy cục bộ 127.0.0.1)

  1. Chạy máy chủ
    
    php start.php start
    Workerman[del.php] bắt đầu ở chế độ DEBUG
    ----------------------- WORKERMAN -----------------------------
    Phiên bản Workerman:3.4.2          Phiên bản PHP:7.1.3
    ------------------------ CÁC TIẾN TRÌNH -------------------------------
    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] 
    ----------------------------------------------------------------
    Nhấn Ctrl-C để thoát. Bắt đầu thành công.

2. Khách hàng kết nối đến máy chủ

Mở trình duyệt chrome, nhấn F12 để mở bảng điều khiển gỡ lỗi, trong mục Console nhập (hoặc đặt đoạn mã dưới đây vào trang html để chạy bằng js)

```javascript
// Giả định địa chỉ IP máy chủ là 127.0.0.1, vui lòng thay đổi thành IP thực tế của máy chủ khi kiểm tra
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":"Đây là tin nhắn"}');
};