Workerman में किसी विशेष क्लाइंट को डेटा कैसे भेजें
वर्कर का उपयोग करके सर्वर बनाने के लिए, GatewayWorker का उपयोग न करते हुए किसी निर्दिष्ट उपयोगकर्ता को संदेश को कैसे धकेलें?
<?php
use Workerman\Worker;
use Workerman\Connection\TcpConnection;
require_once __DIR__ . '/vendor/autoload.php';
// एक कार्यकर्ता कंटेनर को प्रारंभ करें, जो 1234 पोर्ट की निगरानी करता है
$worker = new Worker('websocket://workerman.net:1234');
// ====यहाँ प्रक्रिया की संख्या को 1 पर सेट करना आवश्यक है====
$worker->count = 1;
// uid से कनेक्शन के मैपिंग को बचाने के लिए एक नई संपत्ति जोड़ें (uid उपयोगकर्ता आईडी या क्लाइंट का अद्वितीय पहचानकर्ता है)
$worker->uidConnections = array();
// जब कोई क्लाइंट संदेश भेजता है, तो कार्यान्वयन होने वाली प्रतिक्रिया फ़ंक्शन
$worker->onMessage = function(TcpConnection $connection, $data)
{
global $worker;
// यह जाँचें कि वर्तमान क्लाइंट का पहले से प्रमाणीकरण किया गया है या नहीं, यानी क्या uid सेट है
if(!isset($connection->uid))
{
// प्रमाणीकरण न होने पर पहले पैकेट को uid मानें (यहाँ वास्तविक प्रमाणीकरण को अनदेखा किया गया है)
$connection->uid = $data;
/* uid को कनेक्शन के मैपिंग में सहेजें, ताकि uid के माध्यम से कनेक्शन को आसानी से खोजा जा सके,
* विशिष्ट uid पर डेटा भेजने के लिए
*/
$worker->uidConnections[$connection->uid] = $connection;
return $connection->send('login success, your uid is ' . $connection->uid);
}
// अन्य तर्क, किसी विशेष uid को भेजें या वैश्विक प्रसारण करें
// मान लीजिए संदेश प्रारूप uid:message है जब यह uid पर संदेश भेजता है
// uid जब all हो तब वैश्विक प्रसारण
list($recv_uid, $message) = explode(':', $data);
// वैश्विक प्रसारण
if($recv_uid == 'all')
{
broadcast($message);
}
// विशेष uid को भेजें
else
{
sendMessageByUid($recv_uid, $message);
}
};
// जब कोई क्लाइंट कनेक्शन बंद कर देता है
$worker->onClose = function(TcpConnection $connection)
{
global $worker;
if(isset($connection->uid))
{
// कनेक्शन बंद होने पर मैपिंग को हटाएं
unset($worker->uidConnections[$connection->uid]);
}
};
// सभी प्रमाणीकृत उपयोगकर्ताओं को डेटा भेजें
function broadcast($message)
{
global $worker;
foreach($worker->uidConnections as $connection)
{
$connection->send($message);
}
}
// uid के लिए डेटा भेजना
function sendMessageByUid($uid, $message)
{
global $worker;
if(isset($worker->uidConnections[$uid]))
{
$connection = $worker->uidConnections[$uid];
$connection->send($message);
}
}
// सभी कार्यकर्ताओं को चलाएं (वास्तव में वर्तमान में केवल एक परिभाषित किया गया है)
Worker::runAll();
सूचना:
उपरोक्त उदाहरण uid को प्रसारित करने के लिए है, हालांकि यह एकल प्रक्रिया है, लेकिन 10W ऑनलाइन का समर्थन करना कोई समस्या नहीं है।
ध्यान दें कि यह उदाहरण केवल एकल प्रक्रिया का है, यानी $worker->count को 1 पर सेट करना आवश्यक है। यदि आप मल्टी-प्रोसेसिंग या सर्वर क्लस्टर का समर्थन करना चाहते हैं तो इसके लिए Channel घटक की आवश्यकता होगी जो प्रक्रियाओं के बीच संचार को पूरा करता है, डेवलप करना भी बहुत सरल है, आप Channel घटक क्लस्टर धकेलने का उदाहरण अनुभाग देख सकते हैं।
यदि आप अन्य सिस्टम में क्लाइंट को संदेश भेजना चाहते हैं, तो आप अन्य परियोजनाओं में भेजने के लिए अनुभाग देख सकते हैं।