2012-02-07 14 views
9

Birisi lütfen bu 2 dosyayı kaydedip çalıştırabilir ve neden "ob_flush() [ref.outcontrol] hatası aldığımı söyleyin. Arabelleği temizleme başarısız." Etrafta dolaşmayı denedim ve ob_start() kullanmam gerektiğini söylüyor; ancak yaptığımda, satır satır yazdırmaz, ancak tamamlandığında FOR döngüsünden tüm nesneyi döndürür. BenPHP Hata: ob_flush() [ref.outcontrol]: arabelleği temizleyemedi. Yıkama için tampon yok

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 .. bu yüzden bakmak için başka nerede emin değilim PHP tür yeniyim

<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

çıkış tamponu ilgili php.ini içinde yapılandırma kontrol edin, otomatik on_start için etkinleştirilebilir. Etkin olup olmadığını kontrol etmenin başka bir yolu da başlangıçta ob_end_flush() kullanmak ve tüm yıkıntıları kaldırmaktır. Ayrıca bir 'phpinfo() ile kontrol edebilirsiniz;' – dvicino

+0

Hey, Yanıtınız için teşekkürler. Çıktı arabelleğini etkinleştirmeyi denedim ama sonra satır satır yerine satır nesnesinin tamamını döndürür ... – ThreaT

cevap

10

Sana flush() ile ob_flush() kafa karıştırıcı olduğunu düşünüyorum. ob_start() ve ob_flush(), tüm çıktıları yakalayan bir PHP iç çıktı arabelleğini işlerken, flush(), diğer programlama dillerindeki gibi STDOUT temizleyen normal işlevdir.

Örnek:

<?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. 

DÜZENLEME: web sunucunuzun içeriğini tampon çünkü

Çıktınız, basılmaz. sıkıştırma ve tamponu kapatmak için deneyin:

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

da unutmayın, Safari ve Internet Explorer dahili 1K tampon olması. Bu nedenle, oluşturulmasını sağlamak için 1 KB dolgu verisi (boşluk gibi) eklemeniz gerekir. Uygulamanız bozuldu. Verilerinizi ajax ile sorgulamak istiyorsunuz. istemci tarafında jQuery kullanın:

Sonra
<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 yılında:

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

Merhaba - Cevabınız için teşekkürler. Önerinizi denedim, ancak bir sebepten dolayı satır satır dönmüyor, ancak döngü işlemini tamamladıktan sonra işlemin tamamlanmasını sağladı. – ThreaT

+0

Yardım edebilecek bir düzenleme ekledim. – iblue

+0

Denedim ama hala şans:/ – ThreaT

1

nerede ob_start olduğunu()?

ob_flush, çıktı arabelleğini dosya tutamacınız için temizler. Belki yanlış anladın.

Bir örnek:

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

manual

+0

Merhaba, cevabınız için teşekkürler. Bunu yukarıdaki koda dahil etmedim çünkü yaptığım zaman satır satır satırına dönmüyor, bunun yerine işlemin tamamlanmasının ardından döngü sonuçlarının tamamını döndürüyor. – ThreaT

13

için sadece ihtiyaç ob_flush() bir çıkış tamponu olarak aktif (örneğin ob_start() ile veya yapılandırma ayarlarıyla) 'dir. Henüz yapmadıysanız, ob_flush()'u kaldırmanız yeterlidir. Ya bunu koşullu yapabilirsiniz:

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

Merhaba, cevabınız için teşekkürler. Ob_flush() 'i çıkarmayı denedim, ancak yine de, döngü çizgisini her satırda, her satırın satır ilerledikçe geri döndürmek yerine, işlemi tamamladıktan sonra döndürür. – ThreaT

+0

Görüntülemeden önce önbelleğe alma işleminin, siz ve UA arasındaki yolun herhangi bir yerinde olabileceğini unutmayın: PHP'de, web sunucusunda, ağdaki herhangi bir proxy'de veya sekmede, yerel ağınızda, yerel bilgisayarınızda, yerel tarayıcınızda. En çok, (ve herhangi bir iyi bir şey yapmazsınız ob_flush 'hiçbir şey yapmazsınız) aktif ipucu olabilir, eğer _need_, Eğer HTTP kullanmamalısınız ama başka bir doğrudan soket bağlantısı. – Wrikken

+0

ama nedense o ob_flush() var, ama aynı zamanda bu hatayı atar, böylece display_errors' kapalıyken 'de o hata sadece uzak lol – ThreaT

İlgili konular