Fórum Root.cz
Hlavní témata => Server => Téma založeno: Ladik 06. 04. 2016, 19:44:28
-
Ahoj,
zjednodušený skript:
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.
-
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.
-
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.
-
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.
-
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?
-
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.
-
Asi to nakonec udělám AJAXem, děkuji všem.
-
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 ;)
-
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
-
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.