2012-02-07 10 views
9

Qualcuno potrebbe salvare questi 2 file ed eseguirli e dirmi perché ottengo l'errore "ob_flush() [ref.outcontrol]: non è riuscito a svuotare il buffer. Nessun buffer da svuotare". Ho provato a googling e dice che devo usare ob_start(); ma quando lo faccio, non viene stampato riga per riga, ma restituisce l'intero oggetto dal ciclo FOR quando è stato completato. Sono un po 'nuovo a PHP in modo da non so dove altro guardare ..Errore PHP: ob_flush() [ref.outcontrol]: non è riuscito a svuotare il buffer. Nessun buffer da svuotare

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

Controlla la tua configurazione in php.ini su buffer di uscita, può essere attivato per on_start automaticly. Un altro modo per verificare se è abilitato è usare ob_end_flush() all'inizio e rimuovere tutti i flussi. Inoltre puoi controllare con un 'phpinfo();' – dvicino

+0

Hey, grazie per la tua risposta. Ho provato ad abilitare il buffering dell'output ma poi restituisce l'intero oggetto loop for anziché riga per riga ... – ThreaT

risposta

10

Penso che si sta confondendo ob_flush() con flush(). Mentre ob_start() e ob_flush() gestisce un buffer di output interno PHP che cattura tutte le uscite, flush() è la normale funzione che svuota lo STDOUT come in altri linguaggi di programmazione.

Esempio:

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

EDIT:

tua uscita non viene stampato, perché il vostro server web potrebbe tamponare il contenuto. Prova a disattivare la compressione e il buffering:

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

Si prega di tenere anche a mente, che Safari e Internet Explorer hanno un buffer interno 1K. Quindi è necessario aggiungere 1 KB di dati di riempimento (come spazi), per renderli renderizzati.

MODIFICA 2: L'implementazione è stata interrotta. Vuoi effettuare il polling dei tuoi dati con ajax. Utilizzare jQuery sul lato client:

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

Poi nel 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

Ciao - grazie per la tua risposta. Ho provato il tuo suggerimento ma per qualche motivo non ritorna riga per riga, ma piuttosto restituisce l'intero risultato del ciclo for solo dopo che ha completato l'elaborazione. – ThreaT

+0

Ho aggiunto una modifica che potrebbe aiutare. – iblue

+0

L'ho provato ma ancora senza fortuna:/ – ThreaT

1

Dove è ob_start()?

ob_flush scarica il buffer di output sull'handle del file. Forse hai sbagliato.

Un esempio:

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

manual

+0

Ciao, grazie per la tua risposta. Non l'ho incluso nel codice sopra perché quando lo faccio, non ritorna riga per riga, ma restituisce l'intero risultato del ciclo for solo dopo che ha completato l'elaborazione. – ThreaT

13

È solo necessità ob_flush() se un buffer di uscita è attivo (per esempio mediante ob_start(), o impostazioni di configurazione). Se non lo hai, basta rimuovere lo ob_flush(). Oppure si può rendere condizionale:

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

Ciao, grazie per la tua risposta. Ho provato a rimuovere ob_flush() ma poi restituisce ancora l'intero oggetto loop for solo una volta completata l'elaborazione, invece di restituire ogni riga per riga mentre procede. – ThreaT

+0

Ricordare che la memorizzazione nella cache prima della visualizzazione può avvenire in qualsiasi punto del percorso tra te e l'UA: in PHP, nel server Web, in qualsiasi proxy o hop sulla rete, sulla rete locale, sul computer locale, nel browser locale. Al massimo, puoi suggerire (e se non è attivo alcun buffer di output 'ob_flush' non ti servirà a nulla), se lo hai _need_, non dovresti usare HTTP ma qualche altra connessione socket diretta. – Wrikken

+0

ma per qualche motivo funziona quando ob_flush() è presente, ma genera anche quell'errore, quindi sarebbe perfetto se quell'errore fosse andato via lol – ThreaT