Autor | Zpráva | ||
---|---|---|---|
Dusan Profil * |
#1 · Zasláno: 14. 4. 2014, 15:36:08
Mam napriklad kod:
<?php echo '1'; sleep(5); echo '2'; Output buffering je OFF. Kam posle PHP prve echo v dobe ked sa nachadza na tomto riadku ? - Ak PHP v tomto momente vytvori HTTP response message na aktivnom sietovom spojeni (posle response header a output z echa), preco nevidim v browseri vysledok po castiach ale az po spracovani skriptu ? - Ak PHP v tomto momente vytvori docasny, neuplny output, kam to uklada ? Po ukonceni skriptu teda PHP vytvori HTTP response message a ako body posle finalny output z nejakeho docasneho uloziska ? - Ak to funguje uplne inak, tak ako ? :) Diky za objasnenie |
||
Zechy Profil |
#2 · Zasláno: 14. 4. 2014, 15:45:38
Vysledna HTML stranka se k uzivateli posle az ve chvili, kdy PHP vykona vse co ma, v tomto pripade az vypise obe echa
|
||
Dusan Profil * |
#3 · Zasláno: 14. 4. 2014, 16:09:02
Ak sa ale PHP nachadza na prvom echu, tak uz v tejto dobre predsa odosle http response header nie ?
A zvysok http response message (v tomto pripade vysledok obidvoch echo) odosle az po vykonani celeho skriptu ? To by davalo zmysel... Nerozumiem potom ale niektorym tvrdeniam, ktore som nasiel na webe: Without output buffering (the default), your HTML is sent to the browser in pieces as PHP processes through your script. With output buffering, your HTML is stored in a variable and sent to the browser as one piece at the end of your script. - zdroj Stack Overflow Podla tej prvej vety tomu rozumiem tak, ze PHP narazi na echo, odosle jeho vysledok v ramci http response a pokracuje dalej v skripte... |
||
Joker Profil |
#4 · Zasláno: 14. 4. 2014, 16:31:32
Zechy:
„Vysledna HTML stranka se k uzivateli posle az ve chvili, kdy PHP vykona vse co ma, v tomto pripade az vypise obe echa“ Já si to nemyslím. I když jsem to detailně nezkoumal, PHP podle mě (když není output_buffering) odesílá výstup průběžně. Tzn. na třetím řádku odešle hlavičky a "1", na pátém řádku odešle "2". Můj názor. Dusan: „preco nevidim v browseri vysledok po castiach ale az po spracovani skriptu ?“ Důvod může být i na opačné straně komunikace; Prohlížeč nemusí stránku vykreslovat průběžně, může třeba začít až po nějakém množství přijatých dat. |
||
Dusan Profil * |
#5 · Zasláno: 14. 4. 2014, 16:57:07 · Upravil/a: Dusan
Joker:
„Důvod může být i na opačné straně komunikace; Prohlížeč nemusí stránku vykreslovat průběžně, může třeba začít až po nějakém množství přijatých dat.“ Prohlizec by mal stranku vykreslovat priebezne. Teda aspon podla tejto dokumentacie, ktora hovori o sucasnych major browseroch: For better user experience, the rendering engine will try to display contents on the screen as soon as possible. It will not wait until all HTML is parsed before starting to build and layout the render tree. Parts of the content will be parsed and displayed, while the process continues with the rest of the contents that keeps coming from the network. - cely popis zde:[url=http://www.html5rocks.com/en/tutorials/internals/howbrowserswork/#Rendering_engines[/url] Ale mozno mas pravdu. Asi tam je nejaky limit a zacne to vykreslovat po urcitom mnozstve. Chcelo by to otestovat. |
||
Joker Profil |
#6 · Zasláno: 14. 4. 2014, 17:16:34
„Nečeká na stažení celého dokumentu“ ještě neznamená „vykresluje od prvního přijatého bajtu“.
Hlavně když prohlížeč nemá k dispozici hlavičky, takže třeba ani neví, v jakém je ten jeden přijatý bajt vůbec kódování. |
||
Davex Profil |
#7 · Zasláno: 14. 4. 2014, 18:21:28
Na cestě mezi PHP a prohlížečem může být několik různých bufferů (FastCGI, webserver, reverse proxy, TCP window atd.), u kterých je snaha, aby byly optimálně využity, takže
echo v PHP s vypnutým output_buffering nemusí znamenat, že se data okamžitě ocitnou v prohlížeči. Okamžitému odeslání se pomáhá funkcí flush() , ale používal bych to pouze ve zvláštních případech, když nějaká část skriptu dlouho trvá a je potřeba průběžně něco vypisovat.
|
||
Dusan Profil * |
#8 · Zasláno: 14. 4. 2014, 18:37:27
Davex: Ano, presne. Akurat som sa k tomuto infu dopracoval z dalsich zdrojov...takze uz mi je to jasne. Dik.
Samotna PHP vrstva moze mat teda dva typy bufferu: ob_flush sends an application-initiated buffer. There may be multiple nested ob_starts() in any PHP script. ob_flush passes the current content to the upper layer. PHP itself might (at its own discretion) buffer output. This depends on the backend. But usually FastCGI has a socket buffer on its own. Therefore flush() needs to be invoked as well to send the current content to the webserver Povodny kod som upravil teda takto: <?php for($i = 0; $i < 2000; $i++){ echo ' '; } echo '1'; flush(); sleep(5); echo '2'; Prve echo sa mi teda objavi ihned, a za nim po 5 sekundach druhe echo... A Joker mal pravdu v tom, ze browser moze potrebovat minimalne mnozstvo dat pre vykreslenie stranky. preto je tam cyklus for, inak by sa prve echo nezobrazilo. |
||
Davex Profil |
#9 · Zasláno: 14. 4. 2014, 19:04:01
Dusan:
„A Joker mal pravdu v tom, ze browser moze potrebovat minimalne mnozstvo dat pre vykreslenie stranky.“ Pokud si dobře pamatuji, tak se nemusí posílat moc znaků a mělo by stačit jenom odřádkování "<br>\n" nebo uzavřít HTML element.
|
||
Časová prodleva: 10 let
|
0