ugrás a tartalomhoz

Output buffering

zoliky · 2008. Szep. 17. (Sze), 15.21
Meg tudna valaki magyarazni, hogy kezeli az ob_start(); az 'output_buffering = 4096' erteket, amely a php.ini fajlban talalhato ?

Nekem van egy fajlom amely tobb mint 8192 karaktert tartalmaz, az ob_get_contents(); kinyomja a tartalmat hiba nelkul. Nem ertem, miert nem jelent a PHP hibat amikor tobb mint 4096 karaktert tartalmazo adatot listazok.

A PHP 4096 karaktert kuld at egy csomagban ? A hatralevo adatokat is kinyomja kulon csomagokban, peldaul: 2x4096 ?
Koszonom!
 
1

PHP.ini comment

Poetro · 2008. Szep. 17. (Sze), 16.45
Ahogy a php.ini-ben levő leírás írja:
; Output buffering allows you to send header lines (including cookies) even
; after you send body content, at the price of slowing PHP's output layer a
; bit.

Azaz ennyi byte tárolódik memóriában mielőtt elkezdene kimenetre írni, ezzel lehetővé téve hogy header és cookie parancsokat lehessen végrehajtani akkor is ha már írtunk valamit a kimenetre. Ez mindenképpen működik, további kódolást nem igényel
Az ob_start()-nak ehhez semmi köze, az minden kimenetet memóriában tárol, ameddig meg nem szünteted valamelyik ob_* függvénnyel a kimenet elkapását. Ameddig van a PHP-nak elegendő memória, addig lehet bele pakolni. (esetenként akár több 10 Mb-ot is, de nem ajánlott).
2

kis kiegészítés

Hodicska Gergely · 2008. Szep. 17. (Sze), 22.31
Azaz ennyi byte tárolódik memóriában mielőtt elkezdene kimenetre írni, ezzel lehetővé téve hogy header és cookie parancsokat lehessen végrehajtani akkor is ha már írtunk valamit a kimenetre.
Az itt megadott szám azt jelzi, hogy az output buffer kiindulási mérete mekkora legyen. Ha ez betellik, akkor a PHP kiírja a tartalmát, üríti, majd újból elkezdi megtölteni, és ez így megy tovább. Ha az oldal mérete 12k, akkor ez azt jelenti, hogy 3-szor fog kimenetet küldeni a webszervernek. Minden ilyen írás jár némi overheaddel, ezért célszerű lehet az output_buffer értékét úgy kiválasztani, hogy az oldalak többsége beleférjen, és csak egy írás legyen, ezáltal is gyorsabb lesz a kiszolgálás.

Ha ob_start-ot használunk, akkor ez annyival rosszabb, hogy a PHP nem fogja tudni, hogy mennyi területet foglaljon le, ezért egy kisebb bufferrel indul, amit folyamatosan növelni fog 4k-nként, ezáltal kevésbé hatékony, mint a php.ini beli beállítás. Azt most kapásból nem tudom, hogy ha be van állítva az output_buffer, és így hívuk ob_start-ot, akkor milyen buffer mérettel indul.

Az érmének azonban van még két oldala. Maga a webszerver is buffereli a kimenetet. Az Apache esetén a SendBufferSize beállítással tudjuk szabályozni ezen buffer méretét. Érdemes egy kicsit nagyobb értéket megadni, mint az output_buffer, mert a puszta kimenet mellett ott vannak a headerek is.

Ezen kívül még OS szinten is van bufferelés, érdemes lehet utánanézni, hogy az általáunk használt OS-ben hogyan tudjuk ezt a megfelelő méretre beállítani.


Üdv,
Felhő