लॉन्ग-पोलिंग, वेबसोकेट, सर्वर-सेंटेड इवेंट्स (SSE) और धूमकेतु क्या हैं?


1046

मैंने कुछ लेख पढ़ने की कोशिश की है, लेकिन मैं अभी तक अवधारणाओं पर बहुत स्पष्ट नहीं हूं।

क्या कोई मुझे यह समझाकर शॉट लेना चाहेगा कि ये तकनीकें क्या हैं:

  1. लंबा मतदान
  2. सर्वर-प्रेषित ईवेंट
  3. WebSockets
  4. धूमकेतु

एक बात जो मुझे हर समय आती थी, वह थी कि सर्वर कनेक्शन खुला रखता है और क्लाइंट को डेटा पुश करता है। कनेक्शन कैसे खुला रखा जाता है, और क्लाइंट को धक्का दिया गया डेटा कैसे मिलता है? (ग्राहक डेटा का उपयोग कैसे करता है, शायद कुछ कोड मदद कर सकते हैं?)

अब, मुझे उनमें से कौन सा एक वास्तविक समय के लिए उपयोग करना चाहिए। मैं वेबसोकेट्स के बारे में बहुत कुछ सुन रहा हूँ (socket.io [a node.js लाइब्रेरी] के साथ) लेकिन PHP क्यों नहीं?


1
रीयलटाइम वेबस्कैट या वीब्रट? Php में websocket के लिए एक लाइब्रेरी है, आपको इसके लिए अतिरिक्त कोड लिखने की आवश्यकता है ताकि ZMQ या सिर्फ सॉकेट प्रोग्रामिंग का उपयोग करके काम किया जा सके, नोडजे इसके लिए आसानी से उपलब्ध हैं। Php में websocket आसानी से उपलब्ध नहीं होने का कारण यह है कि आपको एक अतिरिक्त टर्मिनल चलाना है और इसे चालू रखना है ताकि websocket सर्वर आसानी से उपलब्ध हो, आपके पास दो सर्वरों की निचली पंक्ति होगी। और संरचना, php जावास्क्रिप्ट की तरह एक घटना संरचना नहीं है, इसलिए वहाँ है कि, websocket संदेशों को पकड़ने और भेजने के लिए एक घटना संरचना का उपयोग करता है।
पौई

अतिरिक्त रूप से: धूमकेतु और सर्वरसेंट इवेंट्स 2 सर्वर बनाए बिना लगभग वास्तविक समय (वास्तव में नहीं) प्राप्त करने के लिए पीएचपी का वर्कअराउंड हैं।
PauAI

जवाबों:


2075

क्लाइंट के नीचे के उदाहरणों में ब्राउज़र और सर्वर वेबसाइट को होस्ट करने वाला वेबसर्वर है।

इससे पहले कि आप इन तकनीकों को समझ सकें, आपको पहले क्लासिक HTTP वेब ट्रैफ़िक को समझना होगा ।

नियमित HTTP:

  1. एक क्लाइंट एक सर्वर से एक वेबपेज का अनुरोध करता है।
  2. सर्वर प्रतिक्रिया की गणना करता है
  3. सर्वर क्लाइंट को प्रतिक्रिया भेजता है।

एचटीटीपी

अजाक्स मतदान:

  1. एक क्लाइंट नियमित HTTP (ऊपर HTTP देखें) का उपयोग कर सर्वर से एक वेबपेज का अनुरोध करता है।
  2. क्लाइंट अनुरोधित वेबपेज प्राप्त करता है और उस पेज पर जावास्क्रिप्ट को निष्पादित करता है जो नियमित अंतराल पर सर्वर से फ़ाइल का अनुरोध करता है (जैसे 0.5 सेकंड)।
  3. सर्वर प्रत्येक प्रतिक्रिया की गणना करता है और सामान्य HTTP ट्रैफ़िक की तरह इसे वापस भेजता है।

अजाक्स मतदान

अजाक्स लंबा-मतदान:

  1. एक क्लाइंट नियमित HTTP (ऊपर HTTP देखें) का उपयोग कर सर्वर से एक वेबपेज का अनुरोध करता है।
  2. क्लाइंट अनुरोधित वेबपेज प्राप्त करता है और उस पेज पर जावास्क्रिप्ट निष्पादित करता है जो सर्वर से फाइल का अनुरोध करता है।
  3. सर्वर अनुरोधित जानकारी के साथ तुरंत प्रतिक्रिया नहीं देता है लेकिन तब तक इंतजार करता है जब तक कि नई जानकारी उपलब्ध न हो।
  4. जब नई जानकारी उपलब्ध होती है, तो सर्वर नई जानकारी के साथ प्रतिक्रिया करता है।
  5. क्लाइंट नई जानकारी प्राप्त करता है और तुरंत सर्वर को एक और अनुरोध भेजता है, प्रक्रिया को फिर से शुरू करता है।

अजाक्स लंबा मतदान

HTML5 सर्वर भेजे गए ईवेंट (SSE) / EventSource:

  1. एक क्लाइंट नियमित HTTP (ऊपर HTTP देखें) का उपयोग कर सर्वर से एक वेबपेज का अनुरोध करता है।
  2. क्लाइंट अनुरोधित वेबपेज प्राप्त करता है और उस पेज पर जावास्क्रिप्ट को निष्पादित करता है जो सर्वर से कनेक्शन खोलता है।
  3. नई जानकारी उपलब्ध होने पर सर्वर क्लाइंट को एक ईवेंट भेजता है।

    • सर्वर से लेकर क्लाइंट तक का वास्तविक समय ट्रैफिक, ज्यादातर आपको यही चाहिए
    • आप एक इवेंट लूप वाले सर्वर का उपयोग करना चाहेंगे
    • अन्य डोमेन से सर्वर के साथ कनेक्शन केवल सही कॉर्स सेटिंग्स के साथ संभव हैं
    • यदि आप अधिक पढ़ना चाहते हैं, तो मुझे ये बहुत उपयोगी लगे: (लेख) , (लेख) , (लेख) , (ट्यूटोरियल)

एचटीएमएल 5 एसएसई

HTML5 वेबसोकेट:

  1. एक क्लाइंट नियमित HTTP (ऊपर HTTP देखें) का उपयोग कर सर्वर से एक वेबपेज का अनुरोध करता है।
  2. क्लाइंट अनुरोधित वेबपेज को प्राप्त करता है और उस पेज पर जावास्क्रिप्ट को निष्पादित करता है जो सर्वर के साथ एक कनेक्शन खोलता है।
  3. नया डेटा (दोनों तरफ) उपलब्ध होने पर सर्वर और क्लाइंट अब एक दूसरे को संदेश भेज सकते हैं।

    • सर्वर से क्लाइंट तक और क्लाइंट से सर्वर तक रीयल-टाइम ट्रैफ़िक
    • आप एक इवेंट लूप वाले सर्वर का उपयोग करना चाहेंगे
    • WebSockets के साथ दूसरे डोमेन के सर्वर से जुड़ना संभव है।
    • तीसरे पक्ष द्वारा होस्ट किए गए वेबसोकेट सर्वर का उपयोग करना भी संभव है, उदाहरण के लिए पुशर या अन्य । इस तरह आपको केवल ग्राहक पक्ष को लागू करना होगा, जो बहुत आसान है!
    • यदि आप अधिक पढ़ना चाहते हैं, तो मुझे ये बहुत उपयोगी लगे: ( लेख ), (लेख) ( ट्यूटोरियल )।

एचटीएमएल 5 वेबसॉकेट

धूमकेतु:

धूमकेतु एचटीएमएल 5 से पहले तकनीकों का एक संग्रह है जो वास्तविक समय अनुप्रयोगों को प्राप्त करने के लिए स्ट्रीमिंग और लंबे समय से मतदान का उपयोग करता है। विकिपीडिया या इस लेख पर अधिक पढ़ें ।


अब, उनमें से कौन सा मुझे एक रीयलटाइम ऐप के लिए उपयोग करना चाहिए (कि मुझे कोड करने की आवश्यकता है)। मैं वेबसोकेट्स के बारे में बहुत कुछ सुन रहा हूं (सॉकेट के साथ ।io [एक नोड। जेएस लाइब्रेरी]) लेकिन PHP क्यों नहीं?

आप WebSockets के साथ PHP का उपयोग कर सकते हैं, शाफ़्ट देखें


21
यह कमाल का है! मैं एसएसई पर पढ़ रहा हूं और इस लेख को मिला, यह बहुत अच्छा है - जैसे मैंने अब सामान की तुलना की है, क्या आप यहां एसएसई भी शामिल कर सकते हैं ताकि हम वेबसैट के साथ अंतर को भी पार कर सकें?
सूचकांक

1
@ तीमी ओह यह था? मुझे लगा कि SSE का मतलब सर्वर-सेंटेड इवेंट्स है। वैसे भी, धन्यवाद, मैं इसे अब देख रहा हूँ।
इंडेक्स

1
प्रश्न: php में मान लीजिए कि आप वेबसैट का उपयोग कर रहे हैं, क्या हर ग्राहक ws का उपयोग करके मेरे सर्वर से जुड़ा होगा: क्या उसे एक धागा आवंटित किया जाएगा / उसका आकार होगा और सामान्य अनुरोधों के मामले में इसका आकार ~ 2mb होगा? यह नोडज में अलग कैसे होगा? कितने समवर्ती ग्राहक नोडज संभाल सकते हैं और जब यह टूट जाता है तो क्या होता है?
मुहम्मद उमर

5
आप दोनों समाधानों के साथ इसे पूरा कर सकते हैं लेकिन तंत्र अलग है। लंबे समय तक मतदान 'नियमित' http डेटा का उपयोग करता है, एसएसई एक अलग अंतर्निहित प्रोटोकॉल का उपयोग करता है और लंबे मतदान की तुलना में एक अलग सर्वर सेटअप की आवश्यकता होती है।
तीये की

2
यदि आप चाहें तो आप अपाचे का उपयोग कर सकते हैं। लेकिन बहुत से लोग Node.js का उपयोग करते हैं क्योंकि इसमें एक घटना लूप है। लेकिन अपाचे के लिए, stackoverflow.com/questions/12203443/…
Tieme

37

टिएम ने अपने उत्कृष्ट उत्तर में बहुत प्रयास किया, लेकिन मुझे लगता है कि ओपीएस का मूल प्रश्न यह है कि कैसे इन तकनीकों का पीएचपी से संबंधित है बजाय इसके कि प्रत्येक तकनीक कैसे काम करती है।

PHP वेब क्लाइंट में स्पष्ट क्लाइंट साइड html, css, और जावास्क्रिप्ट के अलावा सबसे अधिक उपयोग की जाने वाली भाषा है। वास्तविक समय अनुप्रयोगों के लिए PHP के 2 प्रमुख मुद्दे हैं:

1) PHP एक बहुत ही मूल CGI के रूप में शुरू हुआ। प्रारंभिक अवस्था से ही PHP बहुत आगे बढ़ चुका है, लेकिन यह छोटे चरणों में हुआ। PHP के पास पहले से ही कई लाखों उपयोगकर्ता थे, जो आज एंबेड-सक्षम और लचीली सी लाइब्रेरी बन गई है, जो कि आज है, जिनमें से अधिकांश इसे निष्पादन के पहले मॉडल पर निर्भर थे, इसलिए इसने अभी तक भागने का ठोस प्रयास नहीं किया है आंतरिक रूप से cgi मॉडल। यहां तक ​​कि कमांडलाइन इंटरफेस PHP लाइब्रेरी (लिनक्स पर libphp5.so, विंडोज़ पर php5ts.dll, आदि) को आमंत्रित करता है, जैसे कि यह अभी भी एक GET / POST अनुरोध को संसाधित करता है। यह अभी भी कोड निष्पादित करता है जैसे कि उसे "पेज" बनाना है और फिर जीवन चक्र समाप्त करना है। नतीजतन, इसमें मल्टी-थ्रेड या इवेंट संचालित प्रोग्रामिंग (PHP उपयोक्ता के भीतर) के लिए बहुत कम समर्थन है, जिससे यह वर्तमान में वास्तविक समय, बहु-उपयोगकर्ता अनुप्रयोगों के लिए अव्यावहारिक है।

ध्यान दें कि PHP के पास PHP उपयोक्ता में ईवेंट लूप्स (जैसे लिबनेवेंट) और थ्रेड्स (जैसे pthreads) प्रदान करने के लिए एक्सटेंशन हैं, लेकिन बहुत, बहुत, बहुत सारे एप्लिकेशन इनका उपयोग करते हैं।

2) PHP में अभी भी कचरा संग्रहण के महत्वपूर्ण मुद्दे हैं। हालाँकि इन मुद्दों में लगातार सुधार हो रहा है (संभवतः जैसा कि ऊपर वर्णित जीवन चक्र को समाप्त करना सबसे बड़ा कदम है), यहां तक ​​कि लंबे समय तक चलने वाले PHP अनुप्रयोगों को बनाने के सर्वोत्तम प्रयासों को नियमित रूप से फिर से शुरू करने की आवश्यकता होती है। यह भी वास्तविक समय अनुप्रयोगों के लिए यह अव्यावहारिक है।

PHP 7 इन मुद्दों को ठीक करने के लिए एक शानदार कदम होगा, और वास्तविक समय के अनुप्रयोगों के लिए एक मंच के रूप में बहुत आशाजनक लगता है।


2
एक छोटा सुधार: PHP हमेशा सी में लिखा गया था, जैसा कि यहां देखा जा सकता है: Museum.php.net/php1 इसके अलावा, "कम इस्तेमाल किया (लेकिन बहुत अधिक लोकप्रिय)" बल्कि आत्म-विरोधाभासी है; शायद आपका क्या मतलब है "अधिक फैशनेबल"?
IMSoP

@IMSoP - सुधार के लिए धन्यवाद, मैं एक दशक से PHP का उपयोग कर रहा हूं और हमेशा इस धारणा के तहत रहा हूं कि यह जड़ें पर्ल में थीं। PHP इतिहास पृष्ठ स्पष्ट रूप से समर्थन करता है कि यह मूल रूप से C था। एक क्षण मिलने के बाद मैं अपना उत्तर संपादित करूँगा।
JSON

मैं पर्ल के बारे में थोड़ा हटा दूंगा क्योंकि यह आधिकारिक दस्तावेज के साथ अच्छी तरह से मेल नहीं खाता है, लेकिन यह अभी भी PHP के शुरुआती विकास में एक भ्रामक क्षेत्र है।
JSON

PHP 7 वास्तविक समय के अनुप्रयोगों के लिए एक मंच के रूप में बहुत आशाजनक लगता है? वास्तविक समय के अनुप्रयोगों के लिए PHP7 में क्या सुधार / परिवर्तन?
मैं


9

मैंने इन पर ध्यान देने की कोशिश की है और जावा परिप्रेक्ष्य से उदाहरण और लिखित उदाहरण एकत्र किए हैं ।

जावा डेवलपर्स के लिए HTTP

रिवर्स अजाक्स - पुरानी शैली

सर्वर साइड पर Async हैंडलिंग

रिवर्स अजाक्स - नई शैली

सर्वर ने ईवेंट भेजे

इसे किसी भी जावा डेवलपर के लिए यहां रखा जाए जो एक ही विषय में देख रहा हो।


इन साइटों में से अधिकांश काम नहीं करते हैं!
अलेक्जेंडर डन

@AlexanderDunn इसे लाने के लिए धन्यवाद। मैं इसे अद्यतन लिंक के साथ सही करूंगा
जॉन

1

आप आसानी से अपने वेब ऐप में केवल वास्तविक समय संचार के लिए Node.JS का उपयोग कर सकते हैं। जब यह WebSockets के बारे में है तो Node.JS वास्तव में शक्तिशाली है। इसलिए "Node.js के माध्यम से PHP अधिसूचना" एक महान अवधारणा होगी।

इस उदाहरण को देखें: PHP और Node.js के साथ एक वास्तविक समय चैट ऐप बनाना

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.