विकास से पहले पढ़ें

Workerman के साथ एप्लिकेशन विकसित करने के लिए, आपको निम्नलिखित जानकारी समझनी चाहिए:

एक, Workerman विकास और सामान्य PHP विकास में अंतर

HTTP प्रोटोकॉल से संबंधित चर फ़ंक्शंस का सीधे उपयोग नहीं करने के अलावा, Workerman विकास और सामान्य PHP विकास में ज्यादा अंतर नहीं है।

1, आवेदन स्तर के प्रोटोकॉल में भिन्नता

  • सामान्य PHP विकास आमतौर पर HTTP एप्लिकेशन लेयर प्रोटोकॉल पर आधारित होता है, जहां WebServer डेवलपर्स के लिए प्रोटोकॉल का विश्लेषण कर चुका होता है।
  • Workerman विभिन्न प्रोटोकॉल का समर्थन करता है, जिसमें HTTP, WebSocket जैसे प्रोटोकॉल अंतर्निहित हैं। Workerman डेवलपर्स को सरल कस्टम प्रोटोकॉल संचार का उपयोग करने की सिफारिश करता है।

    • HTTP प्रोटोकॉल विकास के लिए कृपया Http सेवा भाग को संदर्भित करें।

2, अनुरोध चक्र में अंतर

  • PHP वेब अनुप्रयोग में एक बार अनुरोध होने के बाद सभी चर और संसाधनों को मुक्त कर देता है।
  • Workerman द्वारा विकसित एप्लिकेशन पहली बार लोड होने के बाद मेमोरी में स्थायी होते हैं, जिससे वर्ग की परिभाषाएँ, वैश्विक वस्तुएं, और वर्ग के स्थिर सदस्य मुक्त नहीं होते, जो बाद में पुनः उपयोग के लिए लाभकारी होता है।

3, वर्ग और स्थिरांक की पुनः परिभाषा से बचें

  • चूंकि Workerman कैश किए गए PHP फ़ाइलों को संकलित करता है, इसलिए समान वर्ग या स्थिरांक की परिभाषा फ़ाइलों को कई बार require/include करने से बचना चाहिए। फ़ाइलों को require_once/include_once का उपयोग करके लोड करने की सिफारिश की जाती है।

4, सिंडर पैटर्न के कनेक्शन संसाधनों को मुक्त करने में सतर्क रहें

  • चूंकि Workerman हर अनुरोध के बाद वैश्विक वस्तुएं और वर्ग के स्थिर सदस्यों को मुक्त नहीं करता है, डेटाबेस जैसी सिंडर पैटर्न में, अक्सर डेटाबेस उदाहरण (जिसमें एक डेटाबेस सॉकेट कनेक्शन शामिल होता है) को डेटाबेस स्थिर सदस्यों में रखा जाता है, जिससे Workerman प्रक्रिया जीवन चक्र के दौरान इस डेटाबेस सॉकेट कनेक्शन का पुनः उपयोग करता है। ध्यान दें कि जब डेटाबेस सर्वर यह पता लगाता है कि किसी कनेक्शन में एक निश्चित अवधि तक कोई गतिविधि नहीं है तो वह सक्रिय रूप से सॉकेट कनेक्शन को बंद कर सकता है, इस स्थिति में जब फिर से इस डेटाबेस उदाहरण का उपयोग किया जाता है तो त्रुटि होगी, (त्रुटि संदेश mysql gone away के समान)। Workerman ने डेटाबेस क्लास प्रदान की है, जिसमें फिर से कनेक्ट करने की क्षमता है, डेवलपर्स सीधे इसका उपयोग कर सकते हैं।

5, कृपया exit, die स्टेटमेंट का उपयोग न करें

  • Workerman PHP कमांड लाइन मोड पर चल रहा है, जब exit, die स्टेटमेंट को कॉल किया जाता है, तो यह वर्तमान प्रक्रिया को बंद कर देगा। हालाँकि, संतति प्रक्रिया के बंद होने के तुरंत बाद एक समान संतति प्रक्रिया पुनः बनाई जाएगी, लेकिन यह व्यवसाय पर प्रभाव डाल सकता है।

6, कोड में परिवर्तन के बाद सेवा को प्रभावी बनाने के लिए पुनः आरंभ करें

चूंकि Workerman मेमोरी में स्थायी होता है, PHP क्लास यानी फ़ंक्शन की परिभाषा एक बार लोड होने के बाद स्थायी होती है, फिर डिस्क को दोबारा पढ़ा नहीं जाता है, इसलिए कार्यात्मक कोड में संशोधन के बाद हर बार इसे प्रभावी बनाने के लिए पुनः आरंभ करने की आवश्यकता होती है।

दो, समझने के लिए मौलिक अवधारणाएँ

1, TCP ट्रांसमिशन लेयर प्रोटोकॉल

TCP एक कनेक्शन-उन्मुख, विश्वसनीय, IP आधारित ट्रांसमिशन लेयर प्रोटोकॉल है। TCP ट्रांसमिशन लेयर प्रोटोकॉल की एक महत्वपूर्ण विशेषता यह है कि TCP डेटा स्ट्रीम के आधार पर होता है, क्लाइंट के अनुरोध लगातार सर्वर को भेजे जाते हैं, सर्वर को प्राप्त डेटा एक संपूर्ण अनुरोध नहीं हो सकता, बल्कि कई अनुरोध जुड़े हो सकते हैं। इस कारण हमें इस निरंतर डेटा स्ट्रीम में प्रत्येक अनुरोध की सीमाओं को अलग करना होता है। आवेदन स्तर का प्रोटोकॉल मुख्यतः अनुरोध की सीमाओं को परिभाषित करने के लिए एक नियमों का सेट स्थापित करता है, जिससे डेटा का मिश्रण नहीं होता।

2, आवेदन स्तर का प्रोटोकॉल

आवेदन स्तर का प्रोटोकॉल (application layer protocol) यह परिभाषित करता है कि विभिन्न अंतर्निहित प्रणाली पर चलने वाले एप्लिकेशन प्रक्रियाएं (क्लाइंट, सर्वर) आपस में संदेश कैसे संप्रेषित करती हैं, उदाहरण के लिए HTTP, WebSocket आदि सभी आवेदन स्तर के प्रोटोकॉल में आते हैं। उदाहरण के लिए, एक सरल आवेदन स्तर का प्रोटोकॉल इस प्रकार हो सकता है {"module":"user","action":"getInfo","uid":456}\n"। यह प्रोटोकॉल "\n" (ध्यान दें कि यहाँ "\n" का मतलब है नया पंक्ति) के माध्यम से अनुरोध को समाप्त करना प्रदर्शित करता है, और संदेश सामग्री एक स्ट्रिंग होती है।

3, शॉर्ट कनेक्शन

शॉर्ट कनेक्शन का तात्पर्य है कि जब दोनों पक्षों के पास डेटा का आदान-प्रदान होता है, तो एक कनेक्शन स्थापित किया जाता है, डेटा प्रेषण पूरा होने के बाद, कनेक्शन को बंद कर दिया जाता है, यानी प्रत्येक कनेक्शन केवल एक व्यवसाय का प्रेषण पूरा करता है। जैसे WEB साइट के HTTP सर्विस आमतौर पर शॉर्ट कनेक्शन का उपयोग करती है।

शॉर्ट कनेक्शन एप्लिकेशन विकास के लिए कृपया बुनियादी विकास प्रक्रिया अध्याय को संदर्भित करें

4, लॉन्ग कनेक्शन

लॉन्ग कनेक्शन का तात्पर्य है कि एक कनेक्शन पर कई डेटा पैकेट लगातार भेजे जा सकते हैं।

ध्यान दें: लॉन्ग कनेक्शन एप्लिकेशन को हृदय गति जोड़ना आवश्यक है, अन्यथा कनेक्शन को लंबे समय तक निष्क्रिय रहने पर रूटिंग नोड फ़ायरवॉल द्वारा काट दिया जा सकता है।

लॉन्ग कनेक्शन का उपयोग अक्सर बार-बार संचालन, प्वाइंट-टू-प्वाइंट संचार के मामलों में किया जाता है। प्रत्येक TCP कनेक्शन को तीन कदमों में स्थापित करना होता है, जिससे समय लगता है, यदि प्रत्येक संचालन में पहले कनेक्ट करना और फिर संचालन करना शामिल हो, तो प्रसंस्करण गति काफी कम हो जाएगी। इसलिए लॉन्ग कनेक्शन प्रत्येक संचालन के बाद संबद्ध नहीं होता, अगली प्रक्रिया में सीधे डेटा पैकेट भेजना बस OK होता है, TCP कनेक्शन स्थापित करने की कोई आवश्यकता नहीं होती। उदाहरण: डेटाबेस कनेक्शन लॉन्ग कनेक्शन का उपयोग करता है, यदि शॉर्ट कनेक्शन का उपयोग बार-बार संचार के लिए किया जाता है, तो सॉकेट त्रुटियाँ उत्पन्न हो सकती हैं, और बार-बार सॉकेट का निर्माण संसाधनों के लिए भी बर्बादी होती है।

जब क्लाइंट को डेटा सक्रिय रूप से धकेलने की आवश्यकता हो, जैसे कि चैट कक्षीय, तात्कालिक गेम, मोबाइल पुश आदि एप्लिकेशनों को लॉन्ग कनेक्शन की आवश्यकता होती है।
लॉन्ग कनेक्शन एप्लिकेशन विकास के लिए कृपया Gateway/Worker विकास प्रक्रिया को संदर्भित करें

5, स्मूद रीलोड

सामान्य रीलोड प्रक्रिया सभी प्रक्रियाओं को पूरी तरह से बंद करना और फिर नए सेवा प्रक्रियाएँ बनाना है। इस प्रक्रिया के दौरान, कुछ समय के लिए कोई प्रक्रिया सेवाएँ नहीं दे रही होती है, जिससे सेवाएँ अस्थायी रूप से अनुपलब्ध हो जाती हैं, और उच्चConcurrency में, अनिवार्य रूप से अनुरोध विफल हो जाएगा।

जबकि स्मूद रीलोड एक साथ सभी प्रक्रियाओं को बंद नहीं करता, बल्कि एक-एक करके प्रक्रियाएँ बंद करता है, प्रत्येक प्रक्रिया के बंद होने के बाद तुरंत एक नई प्रक्रिया बनाता है, जब तक कि सभी पुरानी प्रक्रियाएँ प्रतिस्थापित नहीं हो जाती हैं।

स्मूद रीलोड Workerman में php your_file.php reload कमांड का उपयोग करके किया जा सकता है, जिससे सेवा गुणवत्ता को प्रभावित करते हुए अनुप्रयोग को अद्यतित किया जा सकता है।

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

तीन, मुख्य प्रक्रिया और संतति प्रक्रिया में भेद करना

यह महत्वपूर्ण है कि कोड मुख्य प्रक्रिया या संतति प्रक्रिया में चल रहा है, सामान्य तौर पर Worker::runAll(); के कॉल से पहले चलने वाला कोड मुख्य प्रक्रिया में होता है, onXXX कलबैक में चलने वाला कोड संतति प्रक्रिया में होता है। ध्यान दें, Worker::runAll(); के बाद लिखा गया कोड कभी नहीं चलेगा।

उदाहरण के लिए, निम्नलिखित कोड

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

// मुख्य प्रक्रिया में चल रहा है
$tcp_worker = new Worker("tcp://0.0.0.0:2347");
// असाइनमेंट प्रक्रिया मुख्य प्रक्रिया में चलती है
$tcp_worker->onMessage = function(TcpConnection $connection, $data)
{
    // यह भाग संतति प्रक्रिया में है
    $connection->send('hello ' . $data);
};

Worker::runAll();

ध्यान दें: मुख्य प्रक्रिया में डेटाबेस, memcache, redis आदि कनेक्शन संसाधनों को प्रारंभ न करें, क्योंकि मुख्य प्रक्रिया में प्रारंभ किए गए कनेक्शन संतति प्रक्रियाओं द्वारा स्वचालित रूप से अनुवादित हो सकते हैं (विशेषकर जब सिंगलटन का उपयोग करने पर), इसलिए सभी प्रक्रियाएँ एक ही कनेक्शन को रखती हैं, सर्वर द्वारा इस कनेक्शन के माध्यम से लौटाए गए डेटा कई प्रक्रियाओं पर पढ़ने योग्य होता है, जिसके कारण डेटा में गड़बड़ी हो सकती है। इसी प्रकार, यदि किसी प्रक्रिया द्वारा कनेक्शन बंद किया जाता है (जैसे daemon मोड में चलने पर मुख्य प्रक्रिया के बंद होने पर कनेक्शन बंद हो जाता है), तो सभी संतति प्रक्रियाओं का कनेक्शन एक साथ बंद हो जाएगा और अप्रत्याशित त्रुटियाँ उत्पन्न होंगी, जैसे mysql gone away की त्रुटि।

onWorkerStart के भीतर कनेक्शन संसाधनों को प्रारंभ करने की सिफारिश की जाती है।