Fórum Root.cz

Hlavní témata => Server => Téma založeno: Ladik 06. 04. 2016, 19:44:28

Název: PHP - výstup do prohlížeče v kombinaci se sleep()
Přispěvatel: Ladik 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.
Název: Re:PHP - výstup do prohlížeče v kombinaci se sleep()
Přispěvatel: Filip Jirsák 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.
Název: Re:PHP - výstup do prohlížeče v kombinaci se sleep()
Přispěvatel: Ladik 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.
Název: Re:PHP - výstup do prohlížeče v kombinaci se sleep()
Přispěvatel: Filip Jirsák 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.
Název: Re:PHP - výstup do prohlížeče v kombinaci se sleep()
Přispěvatel: to_je_jedno 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?
Název: Re:PHP - výstup do prohlížeče v kombinaci se sleep()
Přispěvatel: andy 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.
Název: Re:PHP - výstup do prohlížeče v kombinaci se sleep()
Přispěvatel: Ladik 06. 04. 2016, 23:18:01
Asi to nakonec udělám AJAXem, děkuji všem.
Název: Re:PHP - výstup do prohlížeče v kombinaci se sleep()
Přispěvatel: Dejma 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 ;)
Název: Re:PHP - výstup do prohlížeče v kombinaci se sleep()
Přispěvatel: Robert 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
Název: Re:PHP - výstup do prohlížeče v kombinaci se sleep()
Přispěvatel: Ladik 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.