PHP - výstup do prohlížeče v kombinaci se sleep()

Ladik

PHP - výstup do prohlížeče v kombinaci se sleep()
« kdy: 06. 04. 2016, 19:44:28 »
Ahoj,
zjednodušený skript:

Kód: [Vybrat]
echo 'Zacatek ...<br />';
for( $i = 0 ; $i < 5 ; $i++ )
{
    echo $i . "<br />";
    flush();
    ob_flush();
    sleep(1);
}
echo 'Konec ...<br />';

Ve Firefoxu a Chrome se skript chová podle očekávání (server pošle $i do prohlížeče a prohlížeč výstup zobrazí, počká se 1s a vše se opakuje). V Internet Exploreru se ale výstup zobrazí až najednou po skončení skriptu. Pokud tedy bude počet průchodů 120, tak by se 2 minuty "nic nedělo" a poté by se zobrazil celý výpis. V reálné aplikaci místo "echo $i" bude jiná složitější funkce, kterou bude zpracovávat PHP a po každém jednom zpracování potřebuji do prohlížeče poslat výsledek zpracování a poté 1s počkat, než se zpracuje další průchod cyklem. Nemáte někdo nápad, jak to vyřešit, aby se aplikace chovala v IE stejně jako ve Firefoxu nebo Chromu? Děkuji.


Re:PHP - výstup do prohlížeče v kombinaci se sleep()
« Odpověď #1 kdy: 06. 04. 2016, 20:22:41 »
Použijte AJAX – odešlete celou stránku, a z ní se pak budete opakovaně dotazovat serveru. Případně, pokud nechcete používat JavaScript, použijte automatickou obnovu stránky (meta refresh).

Nejde spoléhat na to, že prohlížeč bude postupně vykreslovat stránku tak, jak dostává její zdroják. Jak vidíte, nefunguje to.

Ladik

Re:PHP - výstup do prohlížeče v kombinaci se sleep()
« Odpověď #2 kdy: 06. 04. 2016, 20:47:14 »
Děkuji - AJAXu jsem se chtěl původně vyhnout. V aplikaci se budou tahat data z DB a v podstatě bych tak každou vteřinou sestavoval nové připojení a řešil SQL s jedním vráceným výsledkem.

Re:PHP - výstup do prohlížeče v kombinaci se sleep()
« Odpověď #3 kdy: 06. 04. 2016, 21:14:55 »
Možná jde i v PHP udělat nějaké zpracování na pozadí a sdílení paměti. A nebo ten váš způsob – postupné odesílání dat – použijte v tom AJAXu. Pro načítání dat AJAXem to bude fungovat – používalo se to jako server push technologie (long polling) před vznikem WebSockets.

Re:PHP - výstup do prohlížeče v kombinaci se sleep()
« Odpověď #4 kdy: 06. 04. 2016, 21:59:26 »
Děkuji - AJAXu jsem se chtěl původně vyhnout. V aplikaci se budou tahat data z DB a v podstatě bych tak každou vteřinou sestavoval nové připojení a řešil SQL s jedním vráceným výsledkem.
A to ma byt nejaky problem?
Děkuji za možnost editace příspěvku.


andy

Re:PHP - výstup do prohlížeče v kombinaci se sleep()
« Odpověď #5 kdy: 06. 04. 2016, 22:16:11 »
To je premature optimization a okrem toho mozes pouzit v mysql memory storage. Existuje aj shared memory (shm funkcie), ale to neskaluje. Tieto sleepy co chces pouzit tiez velmi neskaluju a este musis ratat aj s php exec time limit.

Ladik

Re:PHP - výstup do prohlížeče v kombinaci se sleep()
« Odpověď #6 kdy: 06. 04. 2016, 23:18:01 »
Asi to nakonec udělám AJAXem, děkuji všem.

Dejma

Re:PHP - výstup do prohlížeče v kombinaci se sleep()
« Odpověď #7 kdy: 08. 04. 2016, 09:28:21 »
Taky můžeš použít websocket
php zapisuje do ws serveru a stránka si zase čte proud z ws serveru
google "websocket tutorial php"
pěkný článek je na http://www.itnetwork.cz/php/websocket
nebát se toho ;)

Robert

Re:PHP - výstup do prohlížeče v kombinaci se sleep()
« Odpověď #8 kdy: 08. 04. 2016, 18:31:12 »
Přímo na http://php.net/manual/en/function.flush.php píšou:

Some versions of Microsoft Internet Explorer will only start to display the page after they have received 256 bytes of output, so you may need to send extra whitespace before flushing to get those browsers to display the page.

A přímo v ukázkovém příkladu mají:
echo str_pad('',4096)."\n";

+ nezapomenout na vypnutí gzip

Ladik

Re:PHP - výstup do prohlížeče v kombinaci se sleep()
« Odpověď #9 kdy: 10. 04. 2016, 11:59:32 »
Přímo na http://php.net/manual/en/function.flush.php píšou:

Some versions of Microsoft Internet Explorer will only start to display the page after they have received 256 bytes of output, so you may need to send extra whitespace before flushing to get those browsers to display the page.

A přímo v ukázkovém příkladu mají:
echo str_pad('',4096)."\n";

+ nezapomenout na vypnutí gzip

Super, díky.