Autor Zpráva
Dusan
Profil *
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
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 *
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
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 *
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
„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
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 *
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
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.

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm: