2013-03-10 11 views
6

मेरे पास एक स्क्रिप्ट है जो 1 घंटे की तरह चलती है। मेरे पास 2 वेबहोस्ट हैं, उनमें से एक में, मैं रीयलटाइम में आउटपुट देख सकता हूं, (यह एक लाख बार लूप करता है और सामानों को छूता है) जबकि अन्य वेबहोस्ट पर, मुझे तब तक इंतजार करना पड़ता है जब तक कि कोई आउटपुट देखने से पहले स्क्रिप्ट समाप्त हो जाए बिलकुल।लगातार PHP आउटपुट दिखा रहा है?

रीयलटाइम में आउटपुट दिखाने के लिए मैं सेटिंग कैसे बदल सकता हूं? मुझे लगता है कि यह एक php.ini बात है।

कोड जोड़ना: यह कोड पहले सर्वर में निष्पादित करते समय आउटपुट होगा, लेकिन दूसरे सर्वर में नहीं। अतिरिक्त जानकारी, यदि मैं 1015 के मान को कम रखता हूं, तो पहला सर्वर आउटपुट के साथ प्रतीक्षा करता है। तो ऐसा लगता है कि मेरा पहला सर्वर प्रत्येक 1015 वर्णों को फिसल रहा है, जबकि दूसरा नहीं है।

while ($a++ < 5) { 
    $b = 0; 
    while ($b++ < 1015) { 
    echo "H"; 
    } 
    echo "<br><br>\n"; 
    sleep(1); 
} 

मेरे दूसरे सर्वर पर, आउटपुट बफरिंग बंद है, और मैंने कोई लाभ नहीं लेने के लिए implicit_flush चालू करने का प्रयास किया।

उत्तर

2

समय-समय पर flush पर कॉल करने का प्रयास करें। यदि आप output buffering का उपयोग कर रहे हैं, तो आप इसे ob_end_flush के अनुक्रम के साथ बंद करना चाहेंगे या ob_flush का भी उपयोग कर सकते हैं।

+0

कुछ भी नहीं मेरी दूसरी सर्वर पर काम किया। मुझे लगता है कि सर्वर कुछ सेटिंग्स ओवरराइड कर रहा है। –

6

यह आउटपुट बफरिंग से संबंधित है। यदि आउटपुट बफरिंग चालू है, तो आउटपुट तुरंत क्लाइंट को नहीं भेजा जाता है लेकिन बफर किए गए डेटा की एक निश्चित मात्रा तक प्रतीक्षा करेगा। यह आम तौर पर प्रदर्शन बढ़ाता है लेकिन आपकी तरह की समस्या का कारण बनता है।

सरल उपाय किसी भी php.ini सेटिंग बदलकर आवश्यकता नहीं है, लेकिन बस अपनी स्क्रिप्ट की शुरुआत में इस डाल:

<?php 
    while (@ob_end_flush()); 
?> 

ऐसा करने से फ्लश और सभी उत्पादन बफरिंग को निष्क्रिय कर देगा।

(स्रोत: http://www.php.net/manual/en/function.ob-end-flush.php#example-460)

तुम भी Output Control पर पीएचपी पुस्तिका पढ़ सकते हैं। संबंधित php.ini सेटिंग्स here सूचीबद्ध हैं।

यदि आप यह सुनिश्चित करना चाहते हैं कि चीजें भेजी जा रही हैं (यानी समय लेने वाले कार्य से पहले), उचित समय पर flush() पर कॉल करें।


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

तथ्य ब्राउज़रों में अपने स्वयं के बफ़र्स हो सकता है, खासकर जब सामग्री प्रकार स्पष्ट रूप से सेट नहीं है (ब्राउज़र फ़ाइल की माइम प्रकार सूंघ करने की जरूरत है)। यदि ऐसा है, तो आप ब्राउज़र के व्यवहार को नियंत्रित नहीं कर सकते हैं।

एक तरीका यह है कि इसे हल कर सकते हैं स्पष्ट रूप से सामग्री प्रकार निर्धारित करने के लिए है:

header("Content-Type: text/plain"); // if you don't need HTML 
// OR 
header("Content-Type: text/html"); 

लेकिन इस कार्य करने की गारंटी नहीं है। यह मेरे फ़ायरफ़ॉक्स पर काम करता है लेकिन Chrome नहीं।

वैसे भी, अपने अंतिम कोड देखो की तरह करना चाहिए:

header("Content-Type: text/html"); // Set Content-Type 
while (@ob_end_flush()); // Flush and disable output buffers 
while ($a++ < 5) { 
    $b = 0; 
    while ($b++ < 1015) { 
    echo "H"; 
    //flush(); // In fact because there is no significant delay, you should not flush here. 
    } 
    echo "<br><br>\n"; 
    flush(); // Flush output 
    sleep(1); 
} 
+0

अनुमान है कि मुझे php की आवश्यकता है।आईएनआई सामान, फ्लशिंग ने उस सर्वर पर मेरे लिए कुछ भी नहीं किया। –

+0

@ क्रिस्टियन राफ्टसेथ वेब ब्राउज़र में भी अपना स्वयं का बफरिंग हो सकता है, इसलिए यह हमेशा सर्वर-साइड समस्या नहीं हो सकता है। –

+0

लेकिन मैं एक ही स्क्रिप्ट का उपयोग कर रहा हूं, और एक ही ब्राउज़र में एक ही सत्र और एक ही समय में अलग-अलग सर्वरों पर दोनों स्क्रिप्ट चला रहा हूं। और एक आउटपुट तुरंत प्रदर्शित करता है, दूसरा नहीं करता है। –

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