2012-02-07 10 views
9

फ्लश करने के लिए कोई बफर नहीं है क्या कोई इन 2 फाइलों को सहेज सकता है और उन्हें चला सकता है और मुझे बता सकता है कि मुझे त्रुटि क्यों मिली है "ob_flush() [ref.outcontrol]: बफर फ्लश करने में विफल रहा। फ्लश करने के लिए कोई बफर नहीं है"। मैंने चारों ओर घूमने की कोशिश की और कहा कि मुझे ob_start() का उपयोग करना है; लेकिन जब मैं करता हूं तो यह रेखा से लाइन को प्रिंट नहीं करता है, बल्कि पूरे ऑब्जेक्ट को फोर लूप से पूरा करता है जब यह पूरा हो जाता है। मैं थोड़े पीएचपी के लिए नया तो मैं देखने के लिए और कहाँ यकीन नहीं कर रहा हूँ ..PHP त्रुटि: ob_flush() [ref.outcontrol]: बफर फ्लश करने में विफल रहा।

test_process.php

// This script will write numbers from 1 to 100 into file 
// And sends continuously info to user 
$fp = fopen('/tmp/output.txt', 'w') or die('Failed to open'); 
set_time_limit(120); 
ignore_user_abort(true); 

for($i = 0; $i < 100; $i++){ 
    echo "<script type=\"text/javascript\">parent.document.getElementById('foo').innerHTML += 'Line $i<br />';</script>"; 
    echo str_repeat(' ', 2048); 
    flush(); 
    ob_flush(); 
    sleep(1); 
    fwrite($fp, "$i\n"); 
} 

fclose($fp); 

main.html

<html> 
    <head> 
     <script src="http://code.jquery.com/jquery-latest.min.js" type="text/javascript" charset="utf-8"></script> 

     <style type="text/css" media="screen"> 
      .msg{ background:#aaa;padding:.2em; border-bottom:1px #000 solid} 
      .new{ background-color:#3B9957;} 
      .error{ background-color:#992E36;} 
     </style> 

    </head> 
    <body> 

     <iframe id="loadarea" width="1024px" height="768px"></iframe><br /> 
     <script> 
      function helper() { 
       document.getElementById('loadarea').src = 'test_process.php'; 
      } 
      function kill() { 
       document.getElementById('loadarea').src = ''; 
      } 
     </script> 

     <input type="button" onclick="helper()" value="Start"> 
     <input type="button" onclick="kill()" value="Stop"> 
     <div id="foo"></div> 


</body> 
</html> 
+0

उत्पादन बफर के बारे में php.ini में अपने config की जाँच करें, यह स्वत: on_start को सक्रिय किया जा सकता। यह जांचने का एक और तरीका है कि यह सक्षम है या नहीं, शुरुआत में ob_end_flush() का उपयोग कर रहा है और सभी फ्लश को हटा दें। इसके अलावा आप एक 'phpinfo(); ' – dvicino

+0

अरे के साथ जांच सकते हैं, आपकी प्रतिक्रिया के लिए धन्यवाद। मैंने आउटपुट बफरिंग को सक्षम करने की कोशिश की लेकिन फिर यह लाइन के आधार पर लूप ऑब्जेक्ट के लिए पूरी तरह से लौटाता है ... – ThreaT

उत्तर

10

मुझे लगता है कि आप flush() साथ ob_flush() भ्रमित कर रहे हैं। जबकि ob_start() और ob_flush() एक PHP आंतरिक आउटपुट बफर को संभालता है जो सभी आउटपुट को पकड़ता है, flush() सामान्य प्रोग्राम है जो अन्य प्रोग्रामिंग भाषाओं में STDOUT फ़्लश करता है।

उदाहरण:

<?php 
ob_start(); 
echo "Foobar\nFoobar\nFoobar\n"; 
// Nothing printed yet 
ob_flush(); // Now it is printed. 

echo "Foobar\n"; // Printed directly, because contains a line ending. 

echo "Foobar"; // Not printed, because normally buffers are flushed on line endings 
flush(); // Printed. 

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

आपका आउटपुट, मुद्रित नहीं है, क्योंकि अपने वेब सर्वर सामग्री बफ़र कर सकते हैं। संपीड़न और उत्पादन बफरिंग बंद करने के लिए प्रयास करें:

@apache_setenv('no-gzip', 1); 
@ini_set('zlib.output_compression', 0); 
@ini_set('implicit_flush', 1); 

कृपया यह भी ध्यान में रखना, सफारी और इंटरनेट एक्सप्लोरर एक आंतरिक 1K बफर है। तो आपको उन्हें प्रस्तुत करने के लिए 1 KB पैडिंग डेटा (जैसे रिक्त स्थान) जोड़ने की आवश्यकता है।

संपादित करें 2: आपका कार्यान्वयन टूट गया है। आप AJAX के साथ अपने डेटा को मतदान करना चाहते हैं। ग्राहक के पक्ष jQuery का उपयोग करें:

<div id="counter">0%</div> 
<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.min.js"> 
<script type="text/javascript"> 
function doPoll(){ 
    $.post('script-that-returns-stuff.php', function(data) { 
     $("#counter").html(data); 
     setTimeout(doPoll,5000); 
    }); 
} 
doPoll(); 
</script> 

फिर script-that-returns-stuff.php में:

<?php 
$file = explode("\n", file_get_contents("/tmp/output.txt")); 
$last_line = $file[count($file)-1]; 
echo $last_line."%"; 
+0

हाय - आपकी प्रतिक्रिया के लिए धन्यवाद। मैंने आपके सुझाव की कोशिश की लेकिन किसी कारण से यह रेखा से लाइन वापस नहीं लौटाता है बल्कि यह प्रसंस्करण पूरा करने के बाद ही लूप परिणाम के लिए पूरी तरह से लौटाता है। – ThreaT

+0

मैंने एक संपादन जोड़ा जो मदद कर सकता है। – iblue

+0

मैंने कोशिश की लेकिन अभी भी कोई भाग्य नहीं:/ – ThreaT

1

कहाँ ob_start है()?

ob_flush आउटपुट बफर को आपके फ़ाइल हैंडल पर फ़्लश करता है। शायद आपके पास यह गलत है।

एक उदाहरण:

ob_start(); //start output buffering 
echo 'hello world'; //not outputed 
ob_flush(); //sends the output buffer so displays hello world. 

manual

+0

हाय, आपकी प्रतिक्रिया के लिए धन्यवाद। मैंने उपर्युक्त कोड में इसे शामिल नहीं किया क्योंकि जब मैं करता हूं तो यह लाइन से लाइन वापस नहीं करता है बल्कि यह प्रसंस्करण पूरा करने के बाद ही लूप परिणाम के लिए पूरी तरह से लौटाता है। – ThreaT

13

आप केवल जरूरत ob_flush() एक निर्गम बफर (ob_start() द्वारा उदाहरण के लिए, या विन्यास सेटिंग्स द्वारा) सक्रिय है, तो। यदि आपने नहीं किया है, तो बस ob_flush() हटा दें। या आप इसे सशर्त बना सकते हैं:

if(ob_get_level() > 0) ob_flush(); 
+0

हाय, आपकी प्रतिक्रिया के लिए धन्यवाद। मैंने ob_flush() को बाहर निकालने का प्रयास किया लेकिन फिर भी यह पूरी तरह से प्रसंस्करण पूरा होने के बाद लूप ऑब्जेक्ट के लिए पूरी तरह से लौटाता है, प्रत्येक लाइन को लाइन के अनुसार वापस लौटने की बजाय। – ThreaT

+0

प्रदर्शित करने से पहले कैशिंग को ध्यान में रखें, आपके और यूए के बीच के रूट पर कहीं भी हो सकता है: PHP में, वेबसर्वर में, किसी भी प्रॉक्सी में या नेटवर्क पर हॉप, अपने स्थानीय नेटवर्क पर, अपने स्थानीय कंप्यूटर पर, अपने स्थानीय ब्राउज़र में। अधिकतर, आप संकेत दे सकते हैं (और यदि कोई आउटपुट बफर सक्रिय नहीं है तो 'ob_flush' आपको कोई अच्छा नहीं करेगा), अगर आपने इसे _need_ किया है, तो आपको HTTP का उपयोग नहीं करना चाहिए बल्कि कुछ अन्य प्रत्यक्ष सॉकेट कनेक्शन का उपयोग नहीं करना चाहिए। – Wrikken

+0

लेकिन किसी कारण से यह काम करता है जब ob_flush() वहां होता है, लेकिन यह उस त्रुटि को भी फेंकता है, तो यह सही होगा अगर वह त्रुटि सिर्फ – ThreaT

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