ob_start

ob_start($callback, $chunk_size, $flags)

Włącza bufor wyjścia: wszystko, co skrypt wypisuje (echo, HTML poza <?php), zapisuje się w buforze, zamiast trafić do przeglądarki. Zawartość można potem odebrać, zmienić albo odrzucić. Bufory można zagnieżdżać.

Parametry

  • $callback – opcjonalny, funkcja, która dostaje zawartość bufora i zwraca to, co zostanie faktycznie wysłane.
  • $chunk_size – opcjonalny, po osiągnięciu rozmiaru w bajtach bufor zostanie wysłany. Domyślnie 0 = dopiero na końcu.
  • $flags – opcjonalny, co wolno robić z buforem (opróżnić, wysłać, usunąć).

Przykłady

// wyjście szablonu do zmiennej
function render($heading, $items) {
    ob_start();
    echo "<h2>" . htmlspecialchars($heading) . "</h2>";
    foreach ($items as $i) {
        echo "<li>" . htmlspecialchars($i) . "</li>";
    }
    return ob_get_clean();
}
$html = render("Owoce", array("Jabłko", "Gruszka"));
echo $html; // <h2>Owoce</h2><li>Jabłko</li><li>Gruszka</li>
// zmiana wyjścia funkcją: scalenie spacji
function without_spaces($text) {
    ob_start(fn($content) => preg_replace("/\s+/", " ", $content));
    echo $text;
    ob_end_flush();
}
without_spaces("a   b\n\n  c"); // a b c
// bufory można zagnieżdżać
function depth() {
    $start = ob_get_level();
    ob_start();
    ob_start();
    $d = ob_get_level() - $start;
    ob_end_clean();
    ob_end_clean();
    return $d;
}
echo depth(); // 2

Na co uważać

  • Każde ob_start() zakończ (ob_get_clean, ob_end_clean, ob_end_flush). Niezakończony bufor zostanie wysłany dopiero na końcu skryptu i pomiesza kolejność wyjścia.
  • Bufor wyjścia pozwala wysłać header() także po wypisaniu treści, ale tylko ukrywa błąd w kolejności. Lepiej wysyłaj nagłówki przed wyjściem.
  • Serwer może mieć w php.ini włączone output_buffering. Poziom bufora na początku skryptu nie wynosi wtedy 0, więc nie porównuj go ze stałą liczbą.
  • Duże wyjście w buforze (eksport tysięcy wierszy) zużywa pamięć. Przy dużych wyjściach wysyłaj dane stopniowo.

Powiązane funkcje:
ob_get_clean()
ob_end_flush()
ob_get_contents()
header()
ob_get_level()