चिकनी पुनरारंभ सिद्धांत

चिकनी पुनरारंभ क्या है?

चिकनी पुनरारंभ सामान्य पुनरारंभ से भिन्न है, चिकनी पुनरारंभ ऐसा कर सकती है कि उपयोगकर्ताओं पर प्रभाव डाले बिना सेवा को पुनरारंभ किया जाए (आम तौर पर संक्षिप्त कनेक्शन व्यवसाय के लिए), ताकि PHP प्रोग्राम को फिर से लोड किया जा सके और व्यावसायिक कोड अपडेट किया जा सके।

चिकनी पुनरारंभ सामान्यतः व्यावसायिक अपडेट या संस्करण विमोचन के दौरान प्रयोग की जाती है, जो कि कोड विमोचन के कारण सेवा के अस्थायी रूप से अनुपलब्ध होने के प्रभाव से बचाती है।

नोट
Windows सिस्टम reload का समर्थन नहीं करता।

नोट
लंबे कनेक्शन (जैसे websocket) व्यवसाय के लिए, प्रक्रिया चिकनी रूप से पुनरारंभ होने पर कनेक्शन टूट जाएगा। समाधान यह है कि gatewayWorker जैसी संरचना का उपयोग करें, जिसमें एक समूह प्रक्रियाएँ विशेष रूप से कनेक्शन बनाए रखने के लिए होती हैं, और इस समूह की प्रक्रियाओं की reloadable संपत्ति को false पर सेट किया जाता है। व्यावसायिक तार्किकता एक और समूह worker प्रक्रियाएँ चालू करती हैं, जिसमें gateway और worker प्रक्रियाएँ tcp संचार के माध्यम से एक-दूसरे को कॉल करती हैं। जब व्यवसाय में परिवर्तन की आवश्यकता होती है, तो केवल worker प्रक्रियाओं को पुनरारंभ करें।

सीमाएँ

नोट: केवल on{...} कॉलबैक में लोड की गई फ़ाइलें चिकनी पुनरारंभ के बाद स्वचालित रूप से अपडेट होंगी, प्रारंभ स्क्रिप्ट में सीधे लोड की गई फ़ाइलें या लिखी गई कोडों का पुनरारंभ करने पर स्वचालित रूप से अपडेट नहीं होगा।

निम्नलिखित कोड reload के बाद अपडेट नहीं होगा

$worker = new Worker('http://0.0.0.0:1234');
$worker->onMessage = function($connection, $request) {
    $connection->send('hi'); // लिखी गई कोड गर्म अद्यतन का समर्थन नहीं करती
};
$worker = new Worker('http://0.0.0.0:1234');
require_once __DIR__ . '/your/path/MessageHandler.php'; // प्रारंभ स्क्रिप्ट द्वारा सीधे लोड की गई फ़ाइल गर्म अद्यतन का समर्थन नहीं करती
$messageHandler = new MessageHandler();
$worker->onMessage = [$messageHandler, 'onMessage']; // मान लें कि MessageHandler वर्ग में एक onMessage विधि है

निम्नलिखित कोड reload के बाद स्वचालित रूप से अपडेट होगा

$worker = new Worker('http://0.0.0.0:1234');
$worker->onWorkerStart = function($worker) { // onWorkerStart प्रक्रिया शुरू होने के बाद सक्रिय होने वाला कॉलबैक है
    require_once __DIR__ . '/your/path/MessageHandler.php'; // प्रक्रिया शुरू होने के बाद लोड की गई फ़ाइलें गर्म अद्यतन का समर्थन करती हैं
    $messageHandler = new MessageHandler();
    $worker->onMessage = [$messageHandler, 'onMessage'];
};

MessageHandler.php में परिवर्तन के बाद php start.php reload चलाने पर, MessageHandler.php फिर से लोड होगा और व्यवसायिक तार्किकता का अद्यतन प्रभाव प्राप्त होगा।

संकेत
ऊपर का कोड प्रदर्शित करने के लिए, require_once कथन का उपयोग किया गया है, यदि आपके प्रोजेक्ट का समर्थन psr4 ऑटो लोडिंग करता है, तो require_once कथन कॉल करने की आवश्यकता नहीं है।

चिकनी पुनरारंभ सिद्धांत

Workerman मुख्य प्रक्रिया और सहायक प्रक्रियाओं में विभाजित है, मुख्य प्रक्रिया सहायक प्रक्रियाओं की निगरानी करती है, जबकि सहायक प्रक्रियाएँ क्लाइंट के कनेक्शन और कनेक्शन पर भेजे गए अनुरोध डेटा को प्राप्त करती हैं, संबंधित प्रक्रिया करती हैं और डेटा को क्लाइंट को वापस लौटाती हैं। जब व्यवसायिक कोड अपडेट होता है, तो वास्तव में हमें केवल सहायक प्रक्रियाओं को अपडेट करना है, जिससे कोड को अपडेट करने का उद्देश्य प्राप्त होता है।

जब Workerman मुख्य प्रक्रिया चिकनी पुनरारंभ संकेत प्राप्त करती है, तब मुख्य प्रक्रिया एक सहायक प्रक्रिया को सुरक्षित निकासी (संबंधित प्रक्रिया को वर्तमान अनुरोध को पूरा करने के बाद ही बाहर निकलने देने) का संकेत भेजती है, जब यह प्रक्रिया बाहर निकलती है, तब मुख्य प्रक्रिया एक नई सहायक प्रक्रिया (जिसमें नया PHP कोड लोड किया गया है) फिर से बनाती है, फिर मुख्य प्रक्रिया फिर से एक अन्य पुराने प्रक्रिया को रोकने का आदेश भेजती है, इस प्रकार एक प्रक्रिया के बाद एक प्रक्रिया को पुनरारंभ किया जाता है, जब तक सभी पुराने प्रक्रियाएँ पूरी तरह से प्रतिस्थापित नहीं हो जातीं।

हम देखते हैं कि चिकनी पुनरारंभ वास्तव में पुराने व्यवसाय प्रक्रियाओं को क्रमशः बाहर निकलने और फिर नए प्रक्रियाओं को क्रमशः बनाने के माध्यम से किया जाता है। उपयोगकर्ताओं को चिकनी पुनरारंभ के दौरान प्रभावित नहीं करना सुनिश्चित करने के लिए, यह आवश्यक है कि प्रक्रियाओं में उपयोगकर्ता संबंधित स्थिति जानकारी न हो, अर्थात् व्यवसाय प्रक्रियाएँ最好无状态的,以避免因进程退出而导致信息丢失。