php - मैं बुनियादी "लंबी मतदान" कैसे कार्यान्वित करूं?




http comet (12)

मुझे लांग मतदान कैसे काम करता है (उदाहरण के लिए, this , और this ) पर बहुत सारी जानकारी मिल सकती है, लेकिन कोड में इसे कार्यान्वित करने के बारे में कोई आसान उदाहरण नहीं है

मुझे लगता है कि cometd , जो cometd जेएस ढांचे पर निर्भर करता है, और एक काफी जटिल सर्वर सिस्टम ..

असल में, मैं अनुरोधों को पूरा करने के लिए अपाचे का उपयोग कैसे करूं, और मैं एक साधारण स्क्रिप्ट कैसे लिखूंगा (कहें, PHP में) जो नए संदेशों के लिए सर्वर को "लंबे समय तक" मतदान करेगा?

उदाहरण को स्केल करने योग्य, सुरक्षित या पूर्ण होना आवश्यक नहीं है, इसे केवल काम करने की ज़रूरत है!


PHP और jQuery का उपयोग करके लंबे मतदान करने के तरीके पर यह एक अच्छा 5-मिनट का स्क्रीनकास्ट है: http://screenr.com/SNH

कोड ऊपर डीबीआर के उदाहरण के समान है।


आप icomet ( https://github.com/ideawu/icomet ), libevent के साथ बनाया गया एक C1000K C ++ धूमकेतु सर्वर आज़मा सकते हैं। आईसीमेट एक जावास्क्रिप्ट लाइब्रेरी भी प्रदान करता है, इसे सरल के रूप में उपयोग करना आसान है

var comet = new iComet({
    sign_url: 'http://' + app_host + '/sign?obj=' + obj,
    sub_url: 'http://' + icomet_host + '/sub',
    callback: function(msg){
        // on server push
        alert(msg.content);
    }
});

आईकॉमेट सफारी (आईओएस, मैक), आईईएस (विंडोज), फ़ायरफ़ॉक्स, क्रोम इत्यादि सहित ब्राउज़र और ओएस की एक विस्तृत श्रृंखला का समर्थन करता है।


कोड, डीबीआर के लिए धन्यवाद। रेखा के चारों ओर long_poller.htm में बस एक छोटा टाइपो

1000 /* ..after 1 seconds */

मुझे लगता है कि यह होना चाहिए

"1000"); /* ..after 1 seconds */

इसके लिए काम करने के लिए।

रुचि रखने वालों के लिए, मैंने एक Django समकक्ष की कोशिश की। एक लंबी Django परियोजना शुरू करें, लंबे मतदान के लिए एलपी कहते हैं:

django-admin.py startproject lp

संदेश सर्वर के लिए ऐप msgsrv को कॉल करें:

python manage.py startapp msgsrv

टेम्पलेट्स निर्देशिका के लिए settings.py में निम्न पंक्तियां जोड़ें:

import os.path
PROJECT_DIR = os.path.dirname(__file__)
TEMPLATE_DIRS = (
    os.path.join(PROJECT_DIR, 'templates'),
)

Urls.py में अपने यूआरएल पैटर्न को इस तरह परिभाषित करें:

from django.views.generic.simple import direct_to_template
from lp.msgsrv.views import retmsg

urlpatterns = patterns('',
    (r'^msgsrv\.php$', retmsg),
    (r'^long_poller\.htm$', direct_to_template, {'template': 'long_poller.htm'}),
)

और msgsrv / views.py.py जैसा दिखना चाहिए:

from random import randint
from time import sleep
from django.http import HttpResponse, HttpResponseNotFound

def retmsg(request):
    if randint(1,3) == 1:
        return HttpResponseNotFound('<h1>Page not found</h1>')
    else:
        sleep(randint(2,10))
        return HttpResponse('Hi! Have a random number: %s' % str(randint(1,10)))

अंत में, टेम्पलेट्स / long_poller.htm टाइपो सही के साथ उपरोक्त के समान होना चाहिए। उम्मीद है की यह मदद करेगा।


डब्ल्यूएस-आई समूह ने "विश्वसनीय सुरक्षित प्रोफाइल" नामक कुछ प्रकाशित की जिसमें ग्लास मछली और .NET कार्यान्वयन है जो स्पष्ट inter-operate अच्छी तरह inter-operate

किसी भी भाग्य के साथ वहां एक Javascript कार्यान्वयन भी है।

सिल्वरलाइट कार्यान्वयन भी है जो HTTP डुप्लेक्स का उपयोग करता है पुश होने पर कॉलबैक प्राप्त करने के लिए आप जावास्क्रिप्ट को सिल्वरलाइट ऑब्जेक्ट से कनेक्ट कर सकते हैं

वाणिज्यिक भुगतान संस्करण भी हैं।


मुझे लगता है कि क्लाइंट एक सामान्य एसिंक्रोनस AJAX अनुरोध की तरह दिखता है, लेकिन आप उम्मीद करते हैं कि इसे वापस आने के लिए "लंबा समय" लगेगा।

सर्वर तब ऐसा दिखता है।

while (!hasNewData())
    usleep(50);

outputNewData();

इसलिए, AJAX अनुरोध सर्वर पर जाता है, संभवतः जब यह अंतिम अद्यतन था, तो टाइमस्टैम्प समेत, ताकि आपके पास hasNewData() जानता है कि आपके पास पहले से कौन सा डेटा है। सर्वर तब तक एक लूप में बैठता है जब तक कि नया डेटा उपलब्ध न हो जाए। हर समय, आपका AJAX अनुरोध अभी भी जुड़ा हुआ है, बस डेटा की प्रतीक्षा में लटक रहा है। अंत में, जब नया डेटा उपलब्ध होता है, तो सर्वर इसे आपके AJAX अनुरोध को देता है और कनेक्शन बंद कर देता है।


मैंने धूमकेतु के साथ पकड़ने के लिए इसका इस्तेमाल किया, मैंने जावा ग्लासफ़िश सर्वर का उपयोग करके धूमकेतु भी स्थापित किया है और cometdaily.com की सदस्यता ले कर कई अन्य उदाहरण पाए हैं


यहां Content-type: multipart/x-mixed-replace शीर्षलेख का उपयोग करके एरिक डबेलबॉबर द्वारा PHP में एक सरल लंबे मतदान वाला उदाहरण दिया गया है :

<?

header('Content-type: multipart/x-mixed-replace; boundary=endofsection');

// Keep in mind that the empty line is important to separate the headers
// from the content.
echo 'Content-type: text/plain

After 5 seconds this will go away and a cat will appear...
--endofsection
';
flush(); // Don't forget to flush the content to the browser.


sleep(5);


echo 'Content-type: image/jpg

';

$stream = fopen('cat.jpg', 'rb');
fpassthru($stream);
fclose($stream);

echo '
--endofsection
';

और यहां एक डेमो है:

http://dubbelboer.com/multipart.php


लंबे मतदान के बजाय वेब सॉकेट पर विचार क्यों नहीं करें? वे सेटअप करने के लिए बहुत कुशल और आसान हैं। हालांकि वे केवल आधुनिक ब्राउज़रों में समर्थित हैं। यहां एक त्वरित संदर्भ है


सरलतम नोडजेएस

const http = require('http');

const server = http.createServer((req, res) => {
  SomeVeryLongAction(res);
});

server.on('clientError', (err, socket) => {
  socket.end('HTTP/1.1 400 Bad Request\r\n\r\n');
});

server.listen(8000);

// the long running task - 
function SomeVeryLongAction(response) {
  setTimeout(response.end, 10000);
}

इस ब्लॉग पोस्ट पर एक नज़र डालें जिसमें पाइथन / Django / gevent में एक साधारण चैट ऐप के लिए कोड है।


Tornado को लंबे समय तक मतदान के लिए डिज़ाइन किया गया है, और इसमें सर्वर कोड और जेएस क्लाइंट कोड समेत एक बहुत ही कम (पाइथन की कुछ सौ लाइनें) चैट ऐप / उदाहरण / चैटडेमो शामिल हैं। यह इस तरह काम करता है:

  • ग्राहक जेएस का उपयोग एक अपडेट के लिए पूछने के लिए करते हैं (अंतिम संदेश की संख्या), सर्वर यूआरएल हैंडलर इन्हें प्राप्त करता है और क्लाइंट को कतार में जवाब देने के लिए कॉलबैक जोड़ता है।

  • जब सर्वर को नया संदेश मिलता है, तो ऑनमेज इवेंट आग लगती है, कॉलबैक के माध्यम से लूप होती है, और संदेश भेजती है।

  • क्लाइंट-साइड जेएस संदेश प्राप्त करता है, इसे पृष्ठ पर जोड़ता है, फिर इस नए संदेश आईडी के बाद अपडेट के लिए पूछता है।






comet