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)
- 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"}');
};