উদাহরণ 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;
// এই সংযোগ কোন কোন গ্রুপে যোগ দিয়েছে তা রেকর্ড করতে, 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 এ চলছে)
- সার্ভার চালান
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 চালানোর জন্য রাখুন)
```javascript
// ধরা যাক সার্ভারের আইপি ঠিকানা 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":"এটি একটি বার্তা"}');
};