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:

<?php
ob_start();
echo 'Begin ...<br />';
for( $i = 0 ; $i < 10 ; $i++ )
{
    echo .$i . '<br />';
    ob_flush();
    flush();
    sleep(1);
}
echo 'End ...<br />';
?>
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):

<div id='progress' class='graph'>
    <div id='barr' style='width:0%'><p id='progressText'>0% kész</p></div>
</div>
<?php
ob_start();
while(...) {
    ...
    echo "
<script language='javascript'>
	$('#bar').css('width','{$percent}%');
	$('#progressText').html('".$percent."%');
</script>";
    flush();
    ob_flush();
    ...
}
?>
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.