2009-04-06 22 views
5

मैं काफी एक लंबे डाटा खनन स्क्रिप्ट है, और यह के कुछ हिस्सों में मैं पेज के लिए कुछ जानकारी गूंज (एक foreach पाश के दौरान, वास्तव में।)पीएचपी तत्काल गूंज

हालांकि मैं देख रहा हूँ कि जानकारी भेजी जा रही है ब्राउज़ करने के लिए तुरंत जैसे ही मैंने आशा की थी, लेकिन 'सेगमेंट' में।

क्या कोई ऐसा फ़ंक्शन है जिसका उपयोग मैं अपने प्रतिध्वनि के बाद तुरंत ब्राउज़र पर सभी डेटा भेजने के लिए कर सकता हूं?

धन्यवाद।

+0

के आधार पर क्यों इसे [: डाटा माइनिंग टैग] को टैग किया?!? प्रश्न में डेटा खनन के साथ कुछ लेना देना नहीं है, यह सिर्फ सादा पुराना आउटपुट बफरिंग है। –

उत्तर

14

शायद आप flush() चाहते हैं। हालांकि, PHP आउटपुट बफरिंग का उपयोग कर सकता है। कुछ तरीके हैं जो चीजों को बदल सकते हैं, लेकिन संक्षेप में, आप flush(), फिर ob_flush() कर सकते हैं।

+0

दोह, मेरा एक मिनट पहले। Ob_flush() पर अच्छा, +1 –

+0

@ जेरेमी - मैंने इसे बनाने के लिए एक वोट दिया :) – Tim

5

आप फ्लश() उपयोग करने के बाद प्रत्येक गूंज कोशिश कर सकते हैं, लेकिन फिर भी है कि वेब सर्वर द्वारा चलाए जा रहे हैं पर निर्भर करता ग्राहक के लिए एक लिखने की गारंटी नहीं है।

3

आप immeadiately भेजे जाने के लिए उत्पादन के लिए मजबूर करने कुछ इस तरह उपयोग करने के लिए सक्षम होना चाहिए। इसे उस कोड के हिस्से में रखें जिसे आप आउटपुट भेजना चाहते हैं।

flush(); 
ob_flush(); 
+0

को 'ob_flush();' फिर 'flush();' फ्लश के रूप में नहीं होना चाहिए ' आउटपुट बफरिंग चालू होने पर कुछ भी करें। – Kenaniah

4

भी ध्यान रखें कि कुछ ब्राउज़रों कुछ भी प्रदर्शित जब तक प्रतिक्रिया का ढाँचा डेटा की एक निश्चित मात्रा में होता है शुरू नहीं होगी - 256 या 1024 बाइट की तरह। मैंने उस पैड डेटा से पहले अनुप्रयोगों को पृष्ठ के शीर्ष के पास एक 1024 वर्ण लंबी टिप्पणी के साथ देखा है, इससे पहले कि वे फ्लश करें। यह एक हैक का थोड़ा सा है, लेकिन आवश्यक है।

यह Internet Explorer और Safari IIRC पर लागू होता है।

तो,

  • यदि यह पहली भरा है, सुनिश्चित करें कि आप उत्पादन कम से कम 1024 बाइट्स sofar (HTTP शीर्षक सहित नहीं) किया हुआ है।
  • कॉल फ्लश()
  • आप निर्धारित कर सकते हैं कि वहाँ जगह में उत्पादन बफरिंग, इस मुद्दे ob_flush()

मैं सिर्फ अपनी स्क्रिप्ट के शुरू के निकट

while (ob_get_level()) ob_end_flush(); 

का उपयोग करना चाहते कहीं, और फिर बस

flush(); 

जब भी मैं फ्लश करना चाहता हूं। यह मानता है कि आप किसी भी आउटपुट बफरिंग को बिल्कुल नहीं चाहते हैं, भले ही इसे आपकी स्क्रिप्ट से पहले सेट किया गया हो (जैसे कि PHP.ini या htaccess कॉन्फ़िगरेशन में)।

+1

यह काम करता है, और प्रत्येक गूंज के बाद फ्लश() के बजाय, आप एक 'ob_implicit_flush (true) कर सकते हैं; शुरुआत में, इसके परिणामस्वरूप प्रत्येक आउटपुट कॉल के बाद फ्लश ऑपरेशन होगा, ताकि स्पष्ट कॉल फ्लश() अब जरूरत नहीं है। – GDmac

+0

निश्चित रूप से काम करता है! एक्सप्लोरर में अच्छी तरह से काम कर रहे एक स्पष्ट रूप से फ्लशिंग स्क्रिप्ट थी, लेकिन क्रोम और न ही फ़ायरफ़ॉक्स में, इसलिए मुझे लगा कि समस्या सर्वर-साइड नहीं थी। Ob_implicit_flush (true) को कॉल करने के बाद आउटपुट को कम से कम 1024 बाइट्स तक पैडिंग करने के कारण सभी पेड़ ब्राउज़र को जैसे ही भेजा गया था, डेटा को प्रदर्शित करने के कारण, फ्लश() बाद में लूप में कॉल करने की आवश्यकता नहीं थी। इसलिए मैं पुष्टि करता हूं कि ob_implicit_flush (true) और 1K पैडिंग की आपको आवश्यकता है! बहुत बढ़िया! –

1

पूरी तरह से गूगल क्रोम में बाहर यह काम करने के लिए, इस प्रयास करें:

$i = 0; 
$padstr = str_pad("",512," "); 
echo $padstr; 

while ($i <= 4){ 
    $padstr = str_pad("",512," "); 
    echo $padstr; 
    echo "boysmakesh <BR> "; 
    flush(); 
    sleep(2); 
    $i = $i + 1; 
} 

Ee प्रत्येक गूंज भेजने से पहले 512 बाइट्स भेज रहे हैं। फ्लश करने से पहले सामग्री के अंत में <BR> डालना न भूलें। अन्यथा यह क्रोम में काम नहीं करेगा लेकिन आईई में काम करता है।

डेटा हम गद्दी ब्राउज़र निर्भर है। कुछ ब्राउज़रों के लिए 256 बाइट्स के लिए पर्याप्त है लेकिन कुछ को 1024 बाइट की आवश्यकता है। क्रोम के लिए यह 512 है।

1

पुhew! अंत में मुझे Google क्रोम के बफर मुद्दे का जवाब मिला!सही दिशा में धक्का के लिए boysmakesh के लिए धन्यवाद। यहाँ समारोह मैं का उपयोग करें:

function buffer_flush(){ 

    echo str_pad('', 512); 
    echo '<!-- -->'; 

    if(ob_get_length()){ 

     @ob_flush(); 
     @flush(); 
     @ob_end_flush(); 

    } 

    @ob_start(); 

} 

और यह कैसे मैं इसे कहते है:

show_view('global', 'header'); // Echos the <html><head>... tags and 
           // includes JS and CSS. 

show_view('global', 'splash_screen'); // Shows a loading image telling 
             // the user that everything's okay. 

buffer_flush(); // Pretty obvious. At this point the loading view shows 
       // up on every browser i've tested (chrome, firefox, 
       // IE 7 & 8) 

show_view('global', 'main'); // Has a loop that echos "Test $i<br>" 5 
          // times and calls buffer_flush() each time. 

show_view('global', 'footer'); // End the html page and use JQuery to 
           // fade out the loading view. 
0
ignore_user_abort(TRUE); // run script in background 
set_time_limit(0); // run script forever 
$interval=150000; 
$i = 0; 

if(
    strpos($_SERVER["HTTP_USER_AGENT"], "Gecko") or 
    strpos($_SERVER["HTTP_USER_AGENT"], "WebKit") 
){ 
    # important to change browser into quirks mode 
    echo '<?xml version="1.0" encoding="iso-8859-1"?><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">'; 
} 

function buffer_flush(){ 
    echo "\n\n<!-- Deal with browser-related buffering by sending some incompressible strings -->\n\n"; 
    for ($i = 0; $i < 5; $i++) 
     echo "<!-- abcdefghijklmnopqrstuvwxyz1234567890aabbccddeeffgghhiijjkkllmmnnooppqqrrssttuuvvwwxxyyzz11223344556677889900abacbcbdcdcededfefegfgfhghgihihjijikjkjlklkmlmlnmnmononpopoqpqprqrqsrsrtstsubcbcdcdedefefgfabcadefbghicjkldmnoepqrfstugvwxhyz1i234j567k890laabmbccnddeoeffpgghqhiirjjksklltmmnunoovppqwqrrxsstytuuzvvw0wxx1yyz2z113223434455666777889890091abc2def3ghi4jkl5mno6pqr7stu8vwx9yz11aab2bcc3dd4ee5ff6gg7hh8ii9j0jk1kl2lmm3nnoo4p5pq6qrr7ss8tt9uuvv0wwx1x2yyzz13aba4cbcb5dcdc6dedfef8egf9gfh0ghg1ihi2hji3jik4jkj5lkl6kml7mln8mnm9ono -->\n\n"; 

    while (ob_get_level()) 
     ob_end_flush(); 

    if(ob_get_length()){ 
     @ob_flush(); 
     @flush(); 
     @ob_end_flush(); 
    } 
    @ob_start(); 
} 

ob_start(); 

do{ 

    if($i<10){ 
    buffer_flush(); 
    echo ". ";  
    buffer_flush(); 
    usleep($interval); 

    } else { 
    echo sprintf("<pre>%s</pre>", print_r($_SERVER,true)); 
    break; 
    } 

    $i++; 

}while(true); 
5

हाँ, 1024 बाइट्स करने के लिए अपने उत्पादन padding अधिकांश ब्राउज़र सामग्री प्रदर्शित करने शुरू करने के लिए कारण होगा।

लेकिन हम "How to flush output after each `echo` call?" प्रश्न के किसी भी उत्तर के जवाब से भी सीखते हैं कि 1024 बाइट्स ब्राउज़र बफरिंग प्रभाव तब होता है जब ब्राउज़र को पृष्ठ के वर्ण एन्कोडिंग का अनुमान लगाना पड़ता है, जिसे उचित सामग्री-प्रकार भेजकर रोका जा सकता है हेडर (उदाहरण के लिए। "सामग्री-प्रकार: टेक्स्ट/एचटीएमएल; charset = utf-8"), या उपयुक्त एचटीएमएल मेटा टैग के माध्यम से सामग्री वर्णमाला निर्दिष्ट करके। और यह मेरे लिए सभी ब्राउज़रों में भी काम करता था।

तो मूल रूप से, करने के लिए सभी एक की जरूरत है:

header('Content-Type: text/html; charset=utf-8'); 
ob_implicit_flush(true); 
अतिरिक्त गद्दी या फ्लशिंग की कोई आवश्यकता, कोड के लिए महान कॉस्मेटिक लाभ में से एक है जो साथ

! बेशक, हेडर को किसी भी सामग्री से पहले भेजा जाना चाहिए, और किसी को भी यह सुनिश्चित करना होगा कि आउटपुट बफरिंग नहीं चल रही है।

समस्या मेरे लिए निश्चित रूप से हल हो गई है! कृपया (+1) @ किसी अन्य प्रश्न पर किसी का जवाब भी नहीं है, भले ही यह आपके लिए काम करता हो। यदि, हालांकि, अभी भी एक समस्या का सामना कर रहा है, तो मैं अन्य विशिष्ट परिस्थितियों के लिए उस अन्य प्रश्न के उत्तर की जांच करने का सुझाव देता हूं जो संभावित रूप से काम करने से अंतर्निहित फ्लशिंग को रोक सकता है।

+0

नोट: यदि कोई क्लाइंट को डेटा खंड भेजे जाने पर नियंत्रण करना चाहता है, तो किसी को केवल ob_implicit_flush (true) पर निर्भर होने के बजाय वांछित पल पर फ्लश() का उपयोग करना होगा। –

+0

ओह महान। मैं एक ही मुद्दे के साथ प्रयोग कर रहा था और बस एक सामग्री प्रकार के साथ प्रयास किया और यह काम किया ... और एक ही मुद्दे के साथ अपने स्वयं के प्रश्न का उत्तर दिया है, लेकिन xmlhttprequest के लिए ... हाँ यह काम करता है। और जब मैंने वही खोज की तो मुझे आपका जवाब मिला। –

0

आईआईएस 7, आईई 11 (जीत सर्वर) पर PHP 5.5 चलाना मैंने पाया कि यह फ़ाइल की शुरुआती रेखाओं के रूप में काम करता है। हेडर से पहले कुछ वक्तव्य डालने से पहले हेडर पहले से लिखित त्रुटि उत्पन्न करता है।

header('Content-Type: text/html; charset=utf-8'); 
while (ob_get_level()) ob_end_flush(); 
ob_implicit_flush(true); 

स्क्रिप्ट में ob_flush() के आगे के संदर्भों के कारण एक बफर त्रुटि मौजूद नहीं है।

यह ठीक काम करता है जब मैं एक फाइल संसाधित कर रहा था और ब्राउज़र में एसक्यूएल स्टेटमेंट भेज रहा था, हालांकि जब मैंने डीबी (एमएस सर्वर 2008) को जोड़ दिया था, तब तक स्क्रिप्ट पूरा होने तक मुझे कोई इनपुट वापस नहीं आया था।

0

इस संयोजन अंत में मेरे लिए काम किया, thomasrutter के जवाब

while (ob_get_level()) ob_end_flush(); 
ob_implicit_flush(true); 
संबंधित मुद्दे