परिचय: आपकी वेबसाइट रियल टाइम में "धीमी" क्यों है?
\n\nकल्पना करें कि आप एक शेयर बाजार की वेबसाइट पर गए हैं, और डॉलर की दर केवल पेज को रिफ्रेश करने पर ही अपडेट होती है। या आपने चैट में एक संदेश भेजा, और प्राप्तकर्ता ने इसे 10 सेकंड बाद देखा। परिचित लगता है? यह किसी भी डेवलपर का दर्द है जो एप्लिकेशन को "लाइव" बनाने की कोशिश करता है।
\n\nPHP की दुनिया में, जहां हर अनुरोध का एक छोटा जीवन होता है, रियलटाइम कार्यक्षमताओं को लागू करना एक चुनौतीपूर्ण कार्य है। दो मुख्य दृष्टिकोण जो मदद के लिए आते हैं, वे हैं लॉन्ग पोलिंग और WebSocket। PHP पर आपके प्रोजेक्ट के लिए कौन सा चुनें? आइए बिना किसी बकवास के, लाइव कोड उदाहरणों के साथ समझते हैं।
\n\nPHP में लॉन्ग पोलिंग क्या है? एक रहस्य के साथ लंबा अनुरोध
\n\nलॉन्ग पोलिंग एक सुंदर ट्रिक है जो सामान्य HTTP अनुरोधों का उपयोग करके रियलटाइम कनेक्शन का अनुकरण करने की अनुमति देता है। क्लाइंट सर्वर को एक अनुरोध भेजता है, लेकिन सर्वर तुरंत जवाब नहीं देता है। वह कनेक्शन को तब तक खुला रखता है जब तक कोई नई घटना नहीं होती (जैसे, चैट में एक नया संदेश)। जैसे ही घटना होती है, सर्वर एक प्रतिक्रिया भेजता है, क्लाइंट इसे संसाधित करता है और तुरंत एक नया "लंबा" अनुरोध बनाता है।
\n\nPHP में यह कैसे काम करता है: एक सरल उदाहरण
\n\nमान लीजिए कि हमारे पास एक सरल चैट है। क्लाइंट PHP स्क्रिप्ट को एक AJAX अनुरोध भेजता है, जो एक लूप में "लटका" रहता है जब तक डेटाबेस में कोई नया संदेश नहीं आता।
\n\n<?php\n// long_polling.php\nheader('Content-Type: application/json');\nheader('Cache-Control: no-cache');\n\n$lastMessageId = $_GET['last_id'] ?? 0;\n$timeout = 30; // 30 सेकंड तक प्रतीक्षा करें\n$startTime = time();\n\nwhile (time() - $startTime < $timeout) {\n // DB चेक का अनुकरण करें (वास्तव में - MySQL/PostgreSQL के लिए क्वेरी)\n $newMessages = getNewMessagesFromDB($lastMessageId);\n \n if (!empty($newMessages)) {\n echo json_encode([\n 'status' => 'success',\n 'messages' => $newMessages\n ]);\n exit;\n }\n \n // CPU को मारने से बचने के लिए 1 सेकंड सोएं\n sleep(1);\n}\n\n// अगर 30 सेकंड में कुछ नहीं आया\necho json_encode(['status' => 'timeout', 'messages' => []]);\nexit;\n?>\n\nक्लाइंट (JavaScript) पर यह इस तरह दिखता है:
\n\nfunction startLongPolling(lastId) {\n fetch('/long_polling.php?last_id=' + lastId)\n .then(response => response.json())\n .then(data => {\n if (data.status === 'success') {\n data.messages.forEach(msg => addMessageToChat(msg));\n startLongPolling(data.messages[data.messages.length - 1].id);\n } else {\n startLongPolling(lastId); // टाइमआउट - बस पुनरारंभ करें\n }\n })\n .catch(() => setTimeout(() => startLongPolling(lastId), 1000));\n}\n\n\nPHP में लॉन्ग पोलिंग के फायदे
\n- \n
- कार्यान्वयन में सरलता — किसी अतिरिक्त सर्वर या लाइब्रेरी की आवश्यकता नहीं है। सब कुछ सामान्य Apache/Nginx + PHP-FPM पर काम करता है। \n
- अनुकूलता — जहां HTTP है, वहां काम करता है। प्रॉक्सी, कॉर्पोरेट फ़ायरवॉल से कोई समस्या नहीं। \n
- कम प्रवेश सीमा — यदि आप PHP और AJAX जानते हैं, तो आप पहले से ही लॉन्ग पोलिंग कर सकते हैं। \n
लॉन्ग पोलिंग के नुकसान
\n- \n
- सर्वर पर लोड — प्रत्येक "लंबा" अनुरोध PHP-FPM प्रक्रिया को व्यस्त रखता है। 1000 उपयोगकर्ताओं के लिए, आपको 1000 प्रक्रियाओं की आवश्यकता होगी। \n
- विलंबता (latency) — न्यूनतम विलंबता = 1 सेकंड (sleep के कारण)। यदि sleep कम किया जाए, तो CPU पिघलना शुरू हो जाएगा। \n
- स्केलिंग में कठिनाई — लॉन्ग पोलिंग लोड बैलेंसर्स के साथ अच्छी तरह से काम नहीं करता है (उपयोगकर्ता को किसी विशिष्ट सर्वर से बांधने की आवश्यकता होती है)। \n
PHP में WebSocket: बिना किसी समझौते के वास्तविक रियलटाइम
\n\nWebSocket TCP के ऊपर एक पूर्ण द्विदिश संचार चैनल है। HTTP के माध्यम से हैंडशेक के बाद,