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 cuob_get_cleansauob_end_flush. - Folosești
ob_startdoar ca să ascunzi eroareaheaders already sent. Problema reală este afișarea înainte deheader(), 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.