हृदय की धड़कन

ध्यान दें: लंबे समय से जुड़े अनुप्रयोगों में हृदय की धड़कन जोड़ना अनिवार्य है, अन्यथा कनेक्शन लंबी अवधि तक संचार ना होने के कारण राउटर नोड द्वारा मजबूरन काट दिए जा सकते हैं।

हृदय की धड़कन के मुख्य उद्देश्य दो हैं:

  1. क्लाइंट नियमित रूप से सर्वर को डेटा भेजता है, ताकि कनेक्शन कुछ नोड्स के फ़ायरवॉल के कारण बंद न हो जाएँ, जब लंबे समय तक संचार न हो।

  2. सर्वर हृदय की धड़कन के माध्यम से यह निर्धारित कर सकता है कि क्लाइंट ऑनलाइन है या नहीं, यदि क्लाइंट नियत समय सीमा के भीतर कोई डेटा नहीं भेजता है, तो यह माना जाता है कि क्लाइंट ऑफ़लाइन है। इस प्रकार, यह अत्यंत परिस्थितियों (बिजली बंद, नेटवर्क कटा हुआ आदि) के कारण क्लाइंट के ऑफ़लाइन होने की घटनाओं का पता लगा सकता है।

हृदय की धड़कन के लिए अनुशंसित अंतराल:

क्लाइंट को 60 सेकंड से कम के अंतराल पर हृदय की धड़कन भेजने की सिफारिश की जाती है, जैसे कि 55 सेकंड।

हृदय की धड़कन के डेटा प्रारूप में कोई प्रतिबंध नहीं है, सर्वर को केवल इसे पहचानने में सक्षम होना चाहिए।

हृदय की धड़कन का उदाहरण

<?php
use Workerman\Worker;
use Workerman\Timer;
use Workerman\Connection\TcpConnection;
require_once __DIR__ . '/vendor/autoload.php';

// हृदय की धड़कन का अंतराल 55 सेकंड
define('HEARTBEAT_TIME', 55);

$worker = new Worker('text://0.0.0.0:1234');

$worker->onMessage = function(TcpConnection $connection, $msg) {
    // कनेक्शन के लिए अस्थायी lastMessageTime गुण सेट करें, पिछले बार प्राप्त संदेश का समय रिकॉर्ड करने के लिए
    $connection->lastMessageTime = time();
    // अन्य व्यावसायिक तर्क...
};

// प्रक्रिया प्रारंभ होने के बाद हर 10 सेकंड में चलने वाला एक टाइमर सेट करें
$worker->onWorkerStart = function($worker) {
    Timer::add(10, function()use($worker){
        $time_now = time();
        foreach($worker->connections as $connection) {
            // संभव है कि इस कनेक्शन ने कभी भी संदेश प्राप्त नहीं किया हो, इसलिए lastMessageTime को वर्तमान समय पर सेट करें
            if (empty($connection->lastMessageTime)) {
                $connection->lastMessageTime = $time_now;
                continue;
            }
            // पिछले संवाद समय का अंतर हृदय की धड़कन के अंतराल से अधिक है, तो माना जाए कि क्लाइंट ऑफ़लाइन हो गया है, कनेक्शन बंद करें
            if ($time_now - $connection->lastMessageTime > HEARTBEAT_TIME) {
                $connection->close();
            }
        }
    });
};

Worker::runAll();

उपर्युक्त कॉन्फ़िगरेशन के अनुसार, अगर क्लाइंट 55 सेकंड के भीतर सर्वर को कोई डेटा नहीं भेजता है, तो सर्वर मानता है कि क्लाइंट ऑफ़लाइन हो गया है, और सर्वर कनेक्शन को बंद करके onClose को सक्रिय करता है।

डिस्कनेक्ट और फिर से कनेक्ट (महत्वपूर्ण)

चाहे क्लाइंट हृदय की धड़कन भेज रहा हो या सर्वर, कनेक्शन के टूटने की संभावना है। उदाहरण के लिए, ब्राउज़र का कम होना, js का निलंबन, ब्राउज़र का अन्य टैब पर स्विच करना, कंप्यूटर का स्लीप मोड में जाना, मोबाइल डिवाइस पर नेटवर्क का स्विच करना, सिग्नल की कमजोरी, फोन की स्क्रीन का काला होना, मोबाइल एप्लिकेशन का बैकग्राउंड में स्विच करना, राउटर में समस्या, व्यवसाय का सक्रिय रूप से डिस्कनेक्ट करना आदि। विशेष रूप से बाहरी नेटवर्क वातावरण जटिल है, कई राउटर नोड 1 मिनट के भीतर निष्क्रिय कनेक्शनों को साफ़ करेंगे, यही कारण है कि हृदय की धड़कन का अंतराल 1 मिनट से कम रखने की सिफारिश की जाती है।

बाहरी नेटवर्क माहौल में कनेक्शन को तोड़ना बहुत आसान है, इसलिए डिस्कनेक्ट और फिर से कनेक्ट करना लंबे कनेक्शन अनुप्रयोगों के लिए अनिवार्य कार्यक्षमता होनी चाहिए (डिस्कनेक्ट और फिर से कनेक्ट केवल क्लाइंट द्वारा किया जा सकता है, सर्वर द्वारा नहीं)। उदाहरण के लिए, ब्राउज़र websocket को onclose घटना पर सुनने की आवश्यकता होती है, और जब onclose घटित होता है, तो नई कनेक्शन स्थापित करना चाहिए (यूं कि संभावित गिरावट को रोकने के लिए कनेक्शन को तुरंत स्थापित करें)। और कुछ सख्त, सर्वर को भी नियमित रूप से हृदय की धड़कन डेटा भेजना चाहिए, और क्लाइंट को नियमित रूप से सर्वर के हृदय की धड़कन डेटा को समय पर मॉनिटर करना चाहिए; यदि निर्धारित समय के भीतर सर्वर से हृदय की धड़कन डेटा प्राप्त नहीं होती है, तो कनेक्शन को डिस्कनेक्ट माना जाना चाहिए, कनेक्शन को बंद करना चाहिए और नए कनेक्शन को फिर से स्थापित करना चाहिए।