ob_start / ob_get_clean / ob_end_flush în PHP

Buffer de ieșire PHP 4+ (ob_get_clean: PHP 4.3+)

Pornește un buffer: tot ce afișezi după el este păstrat în memorie în loc să fie trimis imediat.

Sintaxă
ob_start($callback = null, int $chunk_size = 0, int $flags = PHP_OUTPUT_HANDLER_STDFLAGS): bool

Ce face ob_start / ob_get_clean / ob_end_flush

După ob_start, tot ce afișezi cu echo, print sau HTML din afara etichetelor PHP nu mai pleacă spre browser, ci se adună într-un buffer. La final alegi ce faci cu el: ob_get_clean îți dă textul și golește bufferul fără să afișeze nimic, iar ob_end_flush trimite conținutul spre browser și închide bufferul.

Utilizări uzuale: salvezi într-o variabilă HTML-ul generat de un șablon, trimiți antete HTTP după ce a început deja afișarea sau modifici toată pagina înainte de trimitere, cu o funcție dată ca $callback. Bufferele se pot pune unul în altul, iar ob_get_level spune câte sunt deschise.

Parametri

Parametru Descriere
$callback Opțional. O funcție care primește conținutul bufferului și returnează textul care va fi trimis.
$chunk_size Opțional. Dacă bufferul depășește această mărime, este trimis automat. 0 înseamnă fără limită.
$flags Opțional. Controlează ce operații sunt permise pe buffer. Valoarea implicită este potrivită aproape mereu.

Ce returnează

ob_start: true la succes. ob_get_clean: conținutul bufferului sau false dacă nu există buffer. ob_end_flush: true la succes.

Exemple

Exemplul 1: Afișarea salvată într-o variabilă

Primul echo nu apare la locul lui, ci ajunge în variabila $html.

<?php
ob_start();
echo "<p>Salut, Ana!</p>";
$html = ob_get_clean();

echo "Am capturat " . strlen($html) . " caractere: " . $html;

Rezultat

Am capturat 18 caractere: <p>Salut, Ana!</p>

Exemplul 2: Un șablon transformat în text

<?php
file_put_contents("card.php", '<div class="card"><?= htmlspecialchars($nume) ?> din <?= $oras ?></div>');

function randeaza(string $sablon, array $date): string
{
    extract($date);
    ob_start();
    include $sablon;
    return ob_get_clean();
}

$card = randeaza("card.php", ["nume" => "Ion", "oras" => "Brașov"]);
echo $card;

Rezultat

<div class="card">Ion din Brașov</div>

Exemplul 3: Modificarea paginii înainte de trimitere

Funcția dată lui ob_start primește tot conținutul. ob_end_flush trimite rezultatul ei.

<?php
ob_start(fn(string $continut) => str_replace("2025", "2026", $continut));

echo "© 2025 dexblog.ro\n";
echo "Ediția 2025";

ob_end_flush();

Rezultat

© 2026 dexblog.ro
Ediția 2026

Greșeli frecvente

  • Pornești ob_start și uiți să închizi bufferul. La finalul scriptului PHP îl trimite automat, dar codul devine greu de urmărit. Închide fiecare buffer cu ob_get_clean sau ob_end_flush.
  • Folosești ob_start doar ca să ascunzi eroarea headers already sent. Problema reală este afișarea înainte de header(), de exemplu un spațiu înainte de <?php.

Comenzi înrudite

  • echo: Afișează unul sau mai multe texte sau valori în pagină.
  • require / include: Încarcă și rulează codul dintr-un alt fișier PHP.
  • printf: Afișează un text formatat după un șablon, de exemplu numere cu un anumit număr de zecimale.