ugrás a tartalomhoz

ob_flush() flush() nem működik

Theo76 · 2016. Feb. 17. (Sze), 14.32
Sziasztok!

Olyan gondom van, hogy nagy mennyiségű adatot kell feldolgozni php-vel, amit nyomon szeretnék követni. A flush(), ob_flush() tűnt megoldásnak, de valamiért nem csinál semmit... Próbálgattam a php.net/manual-ban lévő példákat, de csak utána iródnak ki a kimeneti adatok, ha a teljes script lefutott.

Ezt a példaprogramot használtam:
  1. <?php  
  2. ob_start();  
  3. echo 'Begin ...<br />';  
  4. for$i = 0 ; $i < 10 ; $i++ )  
  5. {  
  6.     echo .$i . '<br />';  
  7.     ob_flush();  
  8.     flush();  
  9.     sleep(1);  
  10. }  
  11. echo 'End ...<br />';  
  12. ?>  
Egyébként ahogy én akarom majd használni (a kód részletet ajaxal töltöm, be divbe, hogy ne az egész oldalt kelljen frissíteni):
  1. <div id='progress' class='graph'>  
  2.     <div id='barr' style='width:0%'><p id='progressText'>0% kész</p></div>  
  3. </div>  
  4. <?php  
  5. ob_start();  
  6. while(...) {  
  7.     ...  
  8.     echo "  
  9. <script language='javascript'>  
  10.     $('#bar').css('width','{$percent}%');  
  11.     $('#progressText').html('".$percent."%');  
  12. </script>";  
  13.     flush();  
  14.     ob_flush();  
  15.     ...  
  16. }  
  17. ?>  
A rendszer: windows 10 64bit; Apache 2.4.18 64bit; PHP 7.0.3 64bit
 
1

Lehúzás

Hidvégi Gábor · 2016. Feb. 17. (Sze), 22.07
Nekem hosszas kísérletezés után a következő kód működik:

function flush_blokk() {
  $str = ob_get_contents();
  ob_clean();
  print dechex(strlen($str)) . "\r\n" . $str . "\r\n";
  ob_flush();
  flush();
}
function flush_vege() {
  print "0\r\n\r\n";
  ob_flush();
}

//az oldal tetejére
header('Transfer-Encoding: chunked');

A kódban minden blokk után meghívom a flush_blokk() függvényt, az utolsó flush_blokk() után pedig a flush_vege()-t.
2

köszi szépen! :) Közben még

Theo76 · 2016. Feb. 20. (Szo), 20.20
köszi szépen! :)
Közben még egy alternatív megoldásként lehet iframe-be tenni, és akkor is rendesen végrehajtja, bár az manapság már nem számít annyira elegáns megoldásnak.