Tulostuksen puskurointi PHP:ssä
Mureakuha
PHP:ssä on mahdollisuus puskuroida tulostus, eli tallentaa se muistiin ennen selaimelle lähettämistä. Tällöin voidaan esimerkiksi peruuttaa jo tehty tulostus esimerkiksi virhetilanteessa. Puskuroinnin avulla voidaan myös kiertää yleinen Headers already sent-virhe. Puskurointi toteutetaan PHP:n Output Control -kirjastolla.
Toteutus
Puskurointi aloitetaan funktiolla ob_start(). Tämä tulee tehdä ennen kuin mitään on tulostettu. Aloittamisen jälkeen voidaan suorittaa normaalia, tulostavaa koodia. Lopulta puskurointi poistetaan käytöstä. Tähän on olemassa monia eri funktioita, halutun lopputuloksen mukaan:
- ob_end_clean() – haluttaessa lopettaa puskurointi ja poistaa sen sisältö kokonaisuudessaan. Komento siis poistaa puskurin sisällön lähettämättä sitä.
- ob_end_flush() – haluttaessa lopettaa puskurointi ja lähettää se sisältö kokonaisuudessaan.
Lisäksi puskuria voidaan käsitellä myös monilla muilla funktioilla:
- ob_flush() lähettää puskurin sisällön
- ob_clean() poistaa puskurin sisällön
- ob_get_clean() palauttaa puskurin sisällön ja tyhjentää sen
- ob_get_contents() palauttaa puskurin sisällön
- ob_get_flush() palauttaa puskurin sisällön ja lähettää sen
Esimerkki
<?php ob_start(); // Aloitetaan puskurointi echo 'Moikka'; // Tulostetaan jotain $puskuri = ob_get_clean(); // Haetaan puskurin sisältö muuttujaan $puskuri = str_replace(array("\r\n", "\n", "\r"), '<br />' . "\n", $puskuri); // Tehdään $puskurille jotain echo $puskuri; // Tulostetaan $puskurin sisältö ob_flush(); // Lähetetään puskurin sisältö ?>
Takaisinkutsu (callback)
Usein törmää PHP sivuston laatimisessa header, footer toteutustapaan eli jokaisella sivulla yläosa ja alaosa ovat erillisissä tiedostoissa.
<?php include("header.php"); // sivun sisältö include("footer.php"); ?>
Header footer toteutustavassa ei ole muuta vikaa kuin, että jokaiselle sivulle täytyy nuo header ja footer sivut asettaa erikseen. Puskuroinnilla tämä ongelma voidaan kiertää. Ob_start() metodille voidaan asettaa parametrina kutsuttava callback metodi. Lopetusta ei välttävämmä tarvitse tehdä erikseen lopetus metodeilla ob_end_clean tai ob_end_flush vaan se generoituu automaattisesti, kun viimeinen tulostuskomento on käsitelty.
Viimeisen tulostuskomennon suoritettuaan PHP kutsuu ob_start:issa annettua callback metodia ja välittää kaiken puskurissa olevan tiedon ensimmäisessä parametrissa metodille. PHP tulostaa kaiken sen mitä callback metodi palauttaa. ob_start:in callback ominaisuutta voidaan käyttää hyväksi yhdessä template:iden kanssa.
print.php
<?php function callback($buffer) { $html = "-header-"; $html .= $buffer; $html .= "-footer-"; return $html; } ob_start("callback"); ?>
sivu.php, sivu2.php, sivu3.php...
<?php include("print.php"); echo "jotakin sisältöä joka tulee -header- ja -footer- tekstien väliin"; ?>
| Tämä artikkeli on tynkä. Voit auttaa Kuhaa täydentämällä tämän sivun tietoja. |
