उदाहरण 1
(आवश्यक Workerman संस्करण >=3.3.0)
वर्कर आधारित मल्टी-प्रोसेस ग्रुप पुश सिस्टम
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;
// इस कनेक्शन ने कौन से समूह में शामिल हुए हैं, उसे रिकॉर्ड करें, ताकि onclose में group_con_map से संबंधित समूह का डेटा साफ किया जा सके
$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();
परीक्षण (मान लीजिए कि यह सभी 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 none websocket://0.0.0.0:1234 12 [OK]
----------------------------------------------------------------
छोड़ने के लिए Ctrl-C दबाएँ। शुरू करने में सफलता।
2、क्लाइंट सर्वर से कनेक्ट करें
chrome ब्राउज़र खोलें, F12 दबाकर डिबग कंसोल खोलें, Console栏 में टाइप करें (या नीचे दिए गए कोड को HTML पृष्ठ में JS के माध्यम से चलाएँ)
// मान लीजिए सर्वर का आईपी 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":"यह संदेश है"}');
};