Tulostuksen puskurointi PHP:ssä

Mureakuha

Loikkaa: valikkoon, hakuun

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:

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.
Henkilökohtaiset työkalut