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()