PHP के साथ धूमकेतु का उपयोग करना?


82

मैं एक PHP बैकएंड का उपयोग करके वास्तविक समय चैट को लागू करने के बारे में सोच रहा था, लेकिन मैंने धूमकेतु पर चर्चा करने वाली साइट पर इस टिप्पणी को चलाया:

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

क्या ये सच है? या यह कुछ ऐसा है जिसे चारों ओर से कॉन्फ़िगर किया जा सकता है?


4
आप php को fastcgi के रूप में चला सकते हैं ...
Itay Moav -Malimovka

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

1
@ArtjomKurapov आप एक वेब सर्वर में PHP बना सकते हैं, इस प्रकार अनुरोधों को संभालने के लिए अपाचे की विधि को दरकिनार कर सकते हैं - इसे एक वास्तविक PHP सर्वर की तरह सोचें जो केवल धूमकेतु अनुरोधों को ध्यान में रखते हैं ।
क्रिश्चियन

@ क्रिसियन यदि आप 5.4 के बाद से अंतर्निहित php वेबसर्वर का मतलब है तो इसका केवल विकास के लिए और उत्पादन पर इसका उपयोग करने के लिए एक बुरा विचार है
Artjom Kurapov

2
@ArtjomKurapov नहीं, मेरा मतलब एक वास्तविक PHP सर्वर लिखना था, PHP सॉकेट का उपयोग करके पोर्ट 80 को सुनने के लिए और इनपुट पर अनिश्चित काल के लिए ब्लॉक करें - प्रभावी रूप से कैसे सर्वर काम करते हैं। यह पहले से ही phpwebsocket जैसी परियोजनाओं में कार्रवाई में देखा जा सकता है ।
क्रिश्चियन

जवाबों:


61

सहमत होना / विस्तार करना जो पहले ही कहा जा चुका है, मुझे नहीं लगता कि FastCGI समस्या का समाधान करेगा।

अमरीका की एक मूल जनजाति

अपाचे में प्रत्येक अनुरोध अनुरोध पूरा होने तक एक कार्यकर्ता थ्रेड का उपयोग करेगा, जो COMET अनुरोधों के लिए एक लंबा समय हो सकता है।

अजाक्सियन के इस लेख में अपाचे पर COMET का उपयोग करने का उल्लेख है, और यह मुश्किल है। समस्या PHP के लिए विशिष्ट नहीं है, और अपाचे पर उपयोग करने के लिए इच्छित किसी भी बैक-एंड CGI मॉड्यूल पर लागू होती है।

सुझाया गया समाधान 'ईवेंट' MPM मॉड्यूल का उपयोग करना था जो कि अनुरोधों को कार्यकर्ता थ्रेड्स में भेजने के तरीके को बदलता है।

यह एमपीएम HTTP में alive कीप जिंदा समस्या ’को ठीक करने की कोशिश करता है। क्लाइंट द्वारा पहला अनुरोध पूरा करने के बाद, ग्राहक कनेक्शन को खुला रख सकता है, और उसी सॉकेट का उपयोग करके आगे के अनुरोध भेज सकता है। यह टीसीपी कनेक्शन बनाने में साइनिफिगेंट ओवरहेड को बचा सकता है। हालांकि, अपाचे पारंपरिक रूप से क्लाइंट से डेटा की प्रतीक्षा में एक पूरी चाइल्ड प्रोसेस / थ्रेड रखता है, जो अपने स्वयं के नुकसान लाता है। इस समस्या को हल करने के लिए, यह MPM दोनों श्रवण सॉकेट्स को संभालने के लिए एक समर्पित थ्रेड का उपयोग करता है, और सभी सॉकेट जो कि कीप अलाइव राज्य में हैं

दुर्भाग्य से, यह या तो काम नहीं करता है, क्योंकि यह एक अनुरोध पूरा होने के बाद केवल 'स्नूज़' करेगा , ग्राहक से एक नए अनुरोध की प्रतीक्षा कर रहा है।

पीएचपी

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

आपको कंटीन्यूज़ जैसी कुछ चीज़ों की ज़रूरत होती है जो धूमकेतु के अनुरोधों को फिर से शुरू करने की अनुमति देती हैं जब वे जिस घटना से शुरू होते हैं, वह देखी जाती है। AFAIK, यह कुछ ऐसा नहीं है जो PHP में संभव है। मैंने इसे केवल जावा में देखा है - Apache Tomcat सर्वर देखें

संपादित करें:

एक ही सर्वर के पोर्ट 80 पर एक अपाचे सर्वर और एक धूमकेतु-सक्षम सर्वर (उदाहरण के लिए जेट्टी, जावा के लिए tomcat) दोनों को चलाने की अनुमति देने के लिए लोड बैलेंसर ( HAProxy ) का उपयोग करने के बारे में यहां एक लेख है


20
मुझे लगता है कि यह वास्तव में एक समाधान प्रदान नहीं करता है: /
माइक ह्यूस्टन

+1 क्योंकि अपाचे / PHP एक धूमकेतु समाधान को स्केल करने के लिए अच्छे विकल्प नहीं हैं। PHP के उपयोगकर्ताओं के लिए विकल्प 1 हैं) जैसा कि आपने उल्लेख किया है, अतिरिक्त सर्वरों और प्रॉक्सी का पागल कॉन्फ़िगरेशन या 2) एक सास समाधान का उपयोग करके और वेबसंक ऑन-डिमांड जैसी कुछ के माध्यम से धूमकेतु सामान को उतारना।
jvenema

1
यह कई पहलुओं में गलत है। यदि कोई एक-प्रति-उपयोगकर्ता-विधि छोड़ना चाहता है, तो इसे Apache को एक मध्यस्थ के रूप में हटाकर आसानी से प्राप्त किया जा सकता है और PHP को इन अनुरोधों को संभालने देना चाहिए। बेशक, अपाचे सामग्री परोसने में बेहतर काम करता है, इसलिए मैं इस अपाचे-कम PHP को उपडोमेन पर चलाऊंगा जो कि किसी भी सामग्री की सेवा नहीं करता है।
क्रिश्चियन

@MikeHouston IIS में php के साथ कॉमेट करने की कोशिश के बारे में क्या?
रविवि

@ravz, यहाँ IIS और धूमकेतु के बारे में कुछ सामान है: stackoverflow.com/questions/1898848/comet-programming-in-iis , लेकिन मुझे संदेह है कि तेज़- cgi PHP मॉड्यूल की अपाचे जैसी ही सीमाएँ हैं। इसमें एक एकल थ्रेडेड वातावरण का उल्लेख किया गया है: microsoft.com/web/platform/phponwindows.aspx - मैं स्वयं विंडोज सर्वर का उपयोग नहीं करता हूं, इसलिए मैं थ्रेडिंग मॉडल के बारे में निश्चित नहीं हूं।
माइक ह्यूस्टन

14

आप कॉमेट आधारित चैट सिस्टम को लागू करने के लिए नगनेक्स और जावास्क्रिप्ट का उपयोग कर सकते हैं जो कि छोटी मेमोरी या सीपीयू उपयोग के साथ बहुत ही स्केलेबल है।

मेरे पास यहां एक बहुत ही सरल उदाहरण है जो आपको आरंभ कर सकता है। इसमें एनएचपीएम मॉड्यूल के साथ संकलन नगीनेक्स को शामिल किया गया है और इसमें jQuery, PHP और Bash में सरल प्रकाशक / ग्राहक भूमिकाओं के लिए कोड शामिल है।

http://blog.jamieisaacs.com/2010/08/27/comet-with-nginx-and-jquery/


10

पीएचपी

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

  1. यह फ़ाइल I / O का उपयोग करता है जो बहुत धीमी है तो बस मेमोरी से डेटा प्राप्त कर रहा है। उदाहरण के लिए फ़ंक्शन filemtime(),
  2. दूसरा, लेकिन मुझे नहीं लगता कि कम से कम PHP में एक सभ्य धागा मॉडल नहीं है। शेयर कुछ भी नहीं होने के कारण PHP को इसके लिए वैसे भी डिज़ाइन नहीं किया गया था । जैसे स्लाइड कहते हैं "साझा डेटा को डेटा-स्टोर परत पर नीचे धकेल दिया जाता है" जैसे कि MySQL।

वैकल्पिक

मुझे वास्तव में लगता है कि आपको विकल्प चुनने की कोशिश करनी चाहिए यदि आप कोई धूमकेतु / लंबा मतदान करना चाहते हैं। आप उदाहरण के लिए कई भाषाओं का उपयोग कर सकते हैं:

  • जावा / जेवीएम: जेट्टी निरंतरता
  • पायथन: डस्टिन का स्लैश
  • एर्लांग: धूमकेतु / आदि के लिए लोकप्रिय भाषा।
  • लुआ, रूबी, सी, पर्ल बस कुछ नाम।

बस एक साधारण Google खोज का प्रदर्शन करना, आपको बहुत सारे विकल्प भी दिखाएगा PHP (जो मुझे लगता है कि किसी भी बड़े लोड पर आपके सर्वर को मार देगा)।


7

mod_php PHP का उपयोग करने का एकमात्र तरीका नहीं है। आप Fastcgi का उपयोग कर सकते हैं। PHP के साथ संकलित किया जाना चाहिए --enable-fastcgi

FastCGI के रूप में PHP: http://www.fastcgi.com/drupal/node/5?q=node/10


6

आप https://github.com/reactphp/react भी कोशिश कर सकते हैं

रिएक्ट PHP में इवेंट-संचालित प्रोग्रामिंग के लिए एक निम्न-स्तरीय लाइब्रेरी है। इसके मूल में एक ईवेंट लूप है, जिसके शीर्ष पर यह निम्न-स्तरीय उपयोगिताओं को प्रदान करता है, जैसे कि: धाराएँ अमूर्त, async dns रिसॉल्वर, नेटवर्क क्लाइंट / सर्वर, http क्लाइंट / सर्वर, प्रक्रियाओं के साथ सहभागिता। तृतीय-पक्ष लाइब्रेरीज़ इन घटकों का उपयोग कर एस्किनेट नेटवर्क क्लाइंट / सर्वर और अधिक बना सकते हैं।

ईवेंट लूप रिएक्टर पैटर्न (इसलिए नाम) पर आधारित है और दृढ़ता से EventMachine (रूबी), ट्विस्टेड (पायथन) और Node.js (V8) जैसे पुस्तकालयों से प्रेरित है।

परिचयात्मक उदाहरण पोर्ट 1337 पर सुनने वाला एक सरल HTTP सर्वर दिखाता है:

<?php

$i = 0;

$app = function ($request, $response) use (&$i) {
    $i++;

    $text = "This is request number $i.\n";
    $headers = array('Content-Type' => 'text/plain');

    $response->writeHead(200, $headers);
    $response->end($text);
};

$loop = React\EventLoop\Factory::create();
$socket = new React\Socket\Server($loop);
$http = new React\Http\Server($socket);

$http->on('request', $app);

$socket->listen(1337);
$loop->run();

4

मैं एक समान मुद्दा रहा हूँ। एक विकल्प जो मुझे दिलचस्प लग रहा है, वह है कॉमडेट सर्वर का उपयोग करना, जैसे कि कॉमडेट-जावा या कॉमेट-पायथन, कोर संदेश हब के रूप में। आपका PHP कोड तब धूमकेतु सर्वर का एक ग्राहक है - यह अन्य ग्राहकों की तरह ही चैनलों से संदेश पोस्ट या पढ़ सकता है।

यहां एक दिलचस्प कोड स्निपेट जुड़ा हुआ है: http://morglog.org/?p=22=1 जो इस विधि का हिस्सा है (हालांकि डिबग कोड के बिट्स चारों ओर फैले हुए हैं)।


3

मैं वर्तमान में सॉकेट फ़ंक्शंस का उपयोग करके एक स्केलेबल PHP धूमकेतु सर्वर को लागू कर रहा हूं। इसे 'फेट' ([ph] पी कॉम [et]) कहा जाता है

प्रोजेक्ट पेज: http://github.com/Tim-Smart/phet

विकास में शामिल होने के लिए स्वतंत्र। मैंने वर्तमान में अधिकांश सर्वर लॉजिक प्राप्त करने में कामयाबी हासिल की है, बस क्लाइंट साइड स्टफ को समाप्त करने की आवश्यकता है।

संपादित करें: हाल ही में pcntl_forkविधि का उपयोग करके 'मल्टी-थ्रेडिंग' क्षमताओं को जोड़ा गया :)


इस लायब्रेरी का उपयोग करने के लिए कोई उदाहरण आसानी से उपलब्ध नहीं हैं।
फुटट्रॉटर

3

आपके पास PHP में धूमकेतु को लागू करने के लिए एक कठिन समय होगा, सिर्फ इसलिए कि यह अंतर्निहित एकल-थ्रेडेड-नेस है।

Websync ऑन-डिमांड की जांच करें - सेवा आपको सर्वर को साइड पब्लिशिंग के माध्यम से PHP को एकीकृत करने देती है, भारी समवर्ती कनेक्शन सामान को ऑफलोड करती है, और आपको कुछ समय में एक वास्तविक समय चैट ऐप बनाने देगी।



1

आपको PHP में अपना खुद का सर्वर बनाना होगा। अपाचे / mod_php या यहां तक ​​कि fastcgi का उपयोग करना बिल्कुल भी स्केल नहीं होगा। कुछ साल पुराना है, लेकिन आप शुरू कर सकते हैं:

PHP- धूमकेतु-सर्वर: http://sourceforge.net/projects/comet/


0

मुझे लगता है कि यह अधिक मुद्दा है कि हर समय चलने वाले अपाचे धागे में एक समस्या है। यह किसी भी भाषा के साथ विद्यमान होगा यदि यह उसी तरह अपाचे के माध्यम से काम करता है जैसे कि PHP (आमतौर पर) करता है।


1
मुझे लगता है कि बिंदु यह है कि आप आमतौर पर एक प्रक्रिया में प्रति अनुरोध थ्रेड के बजाय एक अनुरोध के अनुसार चलाते हैं।
troelskn
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.