2009-06-03 13 views
12

क्या मुझे ब्राउज़र को यह बताने के लिए किसी भी HTTP शीर्षलेख को वापस करने की आवश्यकता है कि मेरा सर्वर तुरंत कनेक्शन बंद नहीं करेगा और HTML के रूप में प्रदर्शित होने के लिए प्रदर्शित होगा? क्या एचटीएमएल को फ्लश() की तरह बढ़ने के लिए कुछ भी आवश्यक है?लंबे समय तक ब्राउज़र में एचटीएमएल को कैसे बढ़ाया जाए?

इस तकनीक का इस्तेमाल चैट जैसी चीजों के लिए किया जाता था, लेकिन मैं इसे कॉमेट प्रकार के एप्लिकेशन के लिए उपयोग करने के बारे में सोच रहा हूं।

उत्तर

14

Long polling ऐसा कुछ करने के लिए एक आम तकनीक है; संक्षेप में संक्षेप में प्रस्तुत करने में, यह इस प्रकार काम करता है:

  1. क्लाइंट सर्वर को एक एक्सएचआर भेजता है।

    • यदि डेटा तैयार है, तो सर्वर तुरंत इसे वापस कर देता है।
    • यदि नहीं, तो सर्वर कनेक्शन उपलब्ध होने तक कनेक्शन खुला रहता है, फिर यह इसे वापस कर देता है।
    • यदि अनुरोध समय-समय पर, 1 पर वापस जाएं)।
  2. क्लाइंट पर चल रहे पृष्ठ को यह डेटा प्राप्त होता है, और यह इसके साथ करता है।

  3. 1 पर वापस जाएं)

इस तरह फेसबुक implements its chat feature है।

This article लंबे मतदान के कुछ गलत धारणाओं को भी साफ़ करता है, और ऐसा करने के कुछ फायदों का विवरण देता है।

अपनी स्क्रिप्ट के अंत में
+0

यह वही है जो मैं खोज रहा था, इस तथ्य के बावजूद कि प्रश्न का शीर्षक उलझ गया है। – cgp

+0

यह निश्चित रूप से फेसबुक के साथ काम करता है - नोटिफिकेशन, चैट और कई अन्य फीचर्स इस विधि का उपयोग करके काम करते हैं। –

+2

मेरे फेसबुक में चैट को संभालने के लिए बैकएंड पर एरलांग का उपयोग करें ताकि यह सभी खुले कनेक्शन प्रबंधित कर सके। अपाचे/PHP कभी भी उस पैमाने को स्केल करने में सक्षम नहीं होगा। –

0

आप जो कर रहे हैं उसके आधार पर, आप बस अपनी स्क्रिप्ट आय के रूप में गूंज सकते हैं, फिर यह ब्राउज़र को एचटीएमएल भेज देगा क्योंकि यह प्रतिबिंबित होता है।

1

मुझे लगता है कि एक और मजबूत समाधान एक जावास्क्रिप्ट टाइमर वाला एक पृष्ठ है जो सर्वर को नए डेटा के लिए मतदान करता है। प्रतिक्रिया को खोलना कुछ ऐसा नहीं है जिसके लिए HTTP प्रोटोकॉल बनाया गया था।

+0

मेरा पोस्ट करने के बाद मैंने यह देखा। निश्चित रूप से बेहतर जवाब। आप केवल एक डीआईवी प्राप्त कर सकते हैं जिसे आप जावास्क्रिप्ट का उपयोग करके कुछ AJAX सामान भरते रहें। – bdwakefield

+0

मतदान बातचीत की तरह कुछ के लिए एक बहुत ही खराब समाधान हो, जहां विराम बहुत भिन्न हो सकते हैं, और आप प्रतिक्रियाओं को त्वरित रूप से प्रकट करना चाहते हैं y लेकिन साथ ही हजारों ग्राहकों द्वारा लगातार मतदान के साथ अपने सर्वर को बोझ से बचें जो अधिकतर समय वापस नहीं लौटाते हैं। किसी चीज़ के लिए HTTP प्रोटोकॉल का उपयोग करना जो इसे कार्यों के लिए डिज़ाइन नहीं किया गया था और इस तरह के मामले में बेहतर समाधान है। –

1

मैं एचटीएमएल को सिर्फ गूंज/मुद्रित करता हूं जैसा कि मैंने चला था। अगली बिट भेजने से पहले स्क्रिप्ट रोकने के कुछ अलग-अलग तरीके हैं। ब्राउज़र को प्रतीक्षा करने के लिए आपको हेडर या किसी विशेष कोड के साथ कुछ भी करने की आवश्यकता नहीं है। जब तक आपकी स्क्रिप्ट अभी भी चल रही है, तब तक यह HTML को प्रस्तुत करेगा जो इसे स्क्रिप्ट से प्राप्त करता है।

echo "<HTML><HEAD.../HEAD><BODY>"; 
while (running) 
{ 
    echo "printing html... </br>"; 
} 
echo "</BODY></HTML>"; //all done 
0

मैं तुम्हें अजाक्स का उपयोग, बल्कि सादे पुराने HTML की तुलना में ऐसी कार्यक्षमता को लागू करने की जांच का सुझाव देते हैं। यह आपको वास्तुशिल्प डिजाइन और उपयोगकर्ता इंटरफ़ेस

2

के संदर्भ में अधिक लचीलापन की अनुमति देता है जब ग्राहक किसी निश्चित समय के लिए कोई डेटा प्राप्त नहीं करता है तो कनेक्शन बंद हो जाएगा। यह टाइमआउट HTTP शीर्षकों से प्रभावित नहीं हो सकता है। यह क्लाइंट-विशिष्ट है और आमतौर पर 120 सेकंड आईआईआरसी पर सेट होता है।

तो आपको बस इतना करना है कि समय-समय पर टकराने से बचने के लिए नियमित रूप से डेटा की थोड़ी मात्रा भेज दें।

1

हमेशा के लिए (जीमेल की तरह)

इन टेकनीक की सभी फ्रेम कोशिश सिर्फ हैक करता, http यह करने के लिए नहीं बनाया गया है कर रहे हैं।

1

, (कुछ इस तरह यह सोचते हैं आप उत्पादन()

<?php 

set_time_limit(0); // Stop PHP from closing script after 30 seconds 

ob_start(); 

echo str_pad('', 1024 * 1024, 'x'); // Dummy 1 megabyte string 

$buffer = ob_get_clean(); 

while (isset($buffer[0])) { 

$send = substr($buffer, 0, 1024 * 30); // Get 30kbs bytes from buffer :D 
$buffer = substr($buffer, 1024 * 30); // Shorten buffer 

echo $send; // Send buffer 
echo '<br />'; // forces browser to reload contents some how :P 

ob_flush(); // Flush output to browser 
flush(); 

sleep(1); // Sleep for 1 second 

} 

?> 

कि स्क्रिप्ट मूल रूप से 30kbs पर पाठ का 1 मेगाबाइट आउटपुट अपने पेज के शीर्ष पर ob_start रखकर ऑन बफरिंग था का उपयोग (अनुरूपित) कोई फर्क नहीं पड़ता कि उपयोगकर्ता और सर्वर कनेक्शन कितना तेज़ है।

संबंधित मुद्दे