Autor Zpráva
Spud
Profil *
Ahoj,
je nějak možný posílat infromace pro browser, zatímco běží nějaká dlouhotrvající akce? treba ve smycce odeslat po kazdem pruchodu hlasku.

<?php

echo("cekejte prosim, ... <br>\n");

/* dlouho trvajici kod */
while ($i=0; $i<10; $i++) {
echo("zpracovani akce c. $1<br>\n");
volani_funkce_co_dlouho_trva($i)
}

echo("hotovo");
?>
T3RMiX
Profil
AFAIK pokud chces informovat uzivatele (browser) o dobe nacitani nesmis na to pouzivat server-side technologii. Takze spis bych doporucil JavaScript, vzhledem k jeho povaze :)
Marty
Profil
Breaknout cyklus a pamatovat si koncové $i, přesměrovat ho na stránku, kde se mu zobrazí info a parametrem v URL bude $i na této stránce pak budeš pokračovat v cyklu, tam kde si skončil.

Svým způsobem tohle řeší AJAX, tam můžeš uživatele alespoň částečně informovat o probíhání akce, nebo po částečném skončení (viz první odstavec).
Spud
Profil *
hm, AJAX do toho tahat zatim nechci ... myslel jsem, jestlli nejde prubezne vyprazdnovat buffer - koukal jsem na ob_funkce, ale neporadil jsem si s nima.

ob_start();
echo(...);
eb_get_contents();

stejne to vyplivna az nakonec vsechno pohromade
Marty
Profil
Buffer vyprázdní paměť ale všechno co si na obrazovku vypsal se zobrazí až po dokončení a stáhnutí stránky u klienta (PHP instrukce běží na serveru a ten je dřív nepošle).
Spud
Profil *
ok, tak uz jsem nasel reseni - je potreba posilat ob_flush() a po nem jeste flush() - pak to funguje. priklad je v komentarich na help strance u funkce flush() - http://cz.php.net/flush

<?php
$pmt = array("-", "\\", "|", "/" );
for( $i = 0; $i <10; $i ++ ){
&nbsp; &nbsp; sleep(1);
&nbsp; &nbsp; print "Part $i\t".$pmt[$i % 4]."<br>\n";
&nbsp; &nbsp; ob_flush();
&nbsp; &nbsp; flush();
}
?>
Spud
Profil *
tak jeste jednou ...

<?php
$pmt = array("-", "\\", "|", "/" );
for( $i = 0; $i <10; $i ++ ){
sleep(1);
print "Part $i\t".$pmt[$i % 4]."<br>\n";
ob_flush();
flush();
}
?>
Toto téma je uzamčeno. Odpověď nelze zaslat.