PHP 8.5.0 Alpha 1 available for testing

ob_start

(PHP 4, PHP 5, PHP 7, PHP 8)

ob_startActiva el temporizador de salida

Descripción

ob_start(?callable $callback = null, int $chunk_size = 0, int $flags = PHP_OUTPUT_HANDLER_STDFLAGS): bool

Esta función activa el almacenamiento en búfer de la salida. Cuando el almacenamiento en búfer está activo, ninguna salida es enviada desde el script; en su lugar, la salida se almacena en un búfer interno. Consulte ¿Qué salida está bufferizada? para saber exactamente qué salidas están afectadas.

Los búferes de salida son apilables, es decir ob_start() puede ser llamada mientras otro búfer está activo. Si varios búferes de salida están activos, la salida es filtrada secuencialmente a través de cada uno de ellos en el orden de anidación. Consulte Anidamiento de búferes de salida para más detalles.

Consulte Búferes de salida a nivel de usuario para una descripción detallada de los búferes de salida.

Parámetros

callback

Un callback callable opcional puede ser especificado. También puede ser omitido pasando null.

callback es invocado cuando el búfer de salida es vaciado (enviado), limpiado, o cuando el búfer de salida es vaciado al final del script.

La firma del callback es la siguiente:

handler(string $buffer, int $phase = ?): string
buffer
Contenido del buffer de salida.
phase
Máscara de bits de las constantes PHP_OUTPUT_HANDLER_* . Consulte Flags pasados a los gestores de salida para más detalles.

Si callback devuelve false, el contenido del búfer es enviado. Consulte Valores de retorno de los gestores de salida para más detalles.

Advertencia

Llamar a alguna de las siguientes funciones desde un manejador de salida provocará un error fatal: ob_clean(), ob_end_clean(), ob_end_flush(), ob_flush(), ob_get_clean(), ob_get_flush(), ob_start().

Consulte Gestores de salida y Trabajar con los gestores de salida para más detalles sobre los callbacks (manejadores de salida).

chunk_size

Si el parámetro opcional chunk_size es pasado, la función de devolución de llamada es llamada cada nueva línea después de chunk_size bytes de salida. El valor por omisión 0 significa que toda la salida es almacenada en búfer hasta que el búfer sea desactivado. Consulte Tamaño del búfer para más detalles.

flags

El parámetro flags es una máscara que controla las operaciones que pueden ser realizadas sobre el búfer de salida. Por omisión, permite que el búfer de salida sea limpiado, enviado y eliminado, lo cual puede ser definido explícitamente con los indicadores de control del búfer . Consulte Operaciones permitidas en los búferes para más detalles.

Cada flag controla el acceso a un conjunto de funciones, tal como se describe a continuación:

Constante Funciones
PHP_OUTPUT_HANDLER_CLEANABLE ob_clean(),
PHP_OUTPUT_HANDLER_FLUSHABLE ob_flush(),
PHP_OUTPUT_HANDLER_REMOVABLE ob_end_clean(), ob_end_flush() y ob_get_clean(). ob_get_flush().

Nota: Antes de PHP 8.4.0, el parámetro flags podía definir los flags de estado del manejador de salida también.

Valores devueltos

Devuelve true en caso de éxito o false en caso de error.

Ejemplos

Ejemplo #1 Ejemplo de manejo de salida con función de devolución de llamada

<?php

function handler($buffer)
{
// reemplaza todas las patatas por zanahorias
return (str_replace("pommes de terre", "carottes", $buffer));
}

ob_start("handler");

?>
<html>
<body>
<p>Es como comparar zanahorias y patatas.</p>
</body>
</html>
<?php

ob_end_flush
();

?>

El resultado del ejemplo sería:

<html>
<body>
<p>Es como comparar zanahorias y zanahorias.</p>
</body>
</html>

Ejemplo #2 Crea un búfer de salida no eliminable

<?php

ob_start
(null, 0, PHP_OUTPUT_HANDLER_STDFLAGS ^ PHP_OUTPUT_HANDLER_REMOVABLE);

?>

Ver también

  • ob_get_contents() - Devuelve el contenido del búfer de salida
  • ob_end_clean() - Elimina (limpia) el contenido del búfer de salida activo y lo desactiva.
  • ob_end_flush() - Vacía (envía) el valor de retorno del manejador de salida activo y desactiva el búfer de salida activo
  • ob_implicit_flush() - Activa/desactiva el envío implícito
  • ob_gzhandler() - Función de recuperación para la compresión automática de pastillas
  • ob_iconv_handler() - Convierte la codificación de caracteres al manejador del buffer de salida
  • mb_output_handler() - Función de tratamiento de los despliegues
  • ob_tidyhandler() - Función callback de ob_start para reparar el buffer

add a note

User Contributed Notes 6 notes

up
53
Ray Paseur (Paseur ... ImagineDB.com)
20 years ago
You can use PHP to generate a static HTML page. Useful if you have a complex script that, for performance reasons, you do not want site visitors to run repeatedly on demand. A "cron" job can execute the PHP script to create the HTML page. For example:

<?php // CREATE index.html
ob_start();
/* PERFORM COMLEX QUERY, ECHO RESULTS, ETC. */
$page = ob_get_contents();
ob_end_clean();
$cwd = getcwd();
$file = "$cwd" .'/'. "index.html";
@
chmod($file,0755);
$fw = fopen($file, "w");
fputs($fw,$page, strlen($page));
fclose($fw);
die();
?>
up
21
net_navard at yahoo dot com
19 years ago
Hello firends

ob_start() opens a buffer in which all output is stored. So every time you do an echo, the output of that is added to the buffer. When the script finishes running, or you call ob_flush(), that stored output is sent to the browser (and gzipped first if you use ob_gzhandler, which means it downloads faster).

The most common reason to use ob_start is as a way to collect data that would otherwise be sent to the browser.

These are two usages of ob_start():

1-Well, you have more control over the output. Trivial example: say you want to show the user an error message, but the script has already sent some HTML to the browser. It'll look ugly, with a half-rendered page and then an error message. Using the output buffering functions, you can simply delete the buffer and sebuffer and send only the error message, which means it looks all nice and neat buffer and send
2-The reason output buffering was invented was to create a seamless transfer, from: php engine -> apache -> operating system -> web user

If you make sure each of those use the same buffer size, the system will use less writes, use less system resources and be able to handle more traffic.

With Regards, Hossein
up
29
ed.oohay (a) suamhcs_rodnan
21 years ago
Output Buffering even works in nested scopes or might be applied in recursive structures... thought this might save someone a little time guessing and testing :)

<pre><?php

ob_start
(); // start output buffer 1
echo "a"; // fill ob1

ob_start(); // start output buffer 2
echo "b"; // fill ob2
$s1 = ob_get_contents(); // read ob2 ("b")
ob_end_flush(); // flush ob2 to ob1

echo "c"; // continue filling ob1
$s2 = ob_get_contents(); // read ob1 ("a" . "b" . "c")
ob_end_flush(); // flush ob1 to browser

// echoes "b" followed by "abc", as supposed to:
echo "<HR>$s1<HR>$s2<HR>";

?></pre>

... at least works on Apache 1.3.28

Nandor =)
up
6
Asher Haig (ahaig at ridiculouspower dot com)
17 years ago
When a script ends, all buffered output is flushed (this is not a bug: http://bugs.php.net/bug.php?id=42334&thanks=4). What happens when the script throws an error (and thus ends) in the middle of an output buffer? The script spits out everything in the buffer before printing the error!

Here is the simplest solution I have been able to find. Put it at the beginning of the error handling function to clear all buffered data and print only the error:

$handlers = ob_list_handlers();
while ( ! empty($handlers) ) {
ob_end_clean();
$handlers = ob_list_handlers();
}
up
6
Chris
14 years ago
Careful with while using functions that change headers of a page; that change will not be undone when ending output buffering.

If you for instance have a class that generates an image and sets the appropriate headers, they will still be in place after the end of ob.

For instance:
<?php
ob_start
();
myClass::renderPng(); //header("Content-Type: image/png"); in here
$pngString = ob_get_contents();
ob_end_clean();
?>

will put the image bytes into $pngString, and set the content type to image/png. Though the image will not be sent to the client, the png header is still in place; if you do html output here, the browser will most likely display "image error, cannot be viewed", at least firefox does.

You need to set the correct image type (text/html) manually in this case.
up
2
ernest at vogelsinger dot at
19 years ago
When you rely on URL rewriting to pass the PHP session ID you should be careful with ob_get_contents(), as this might disable URL rewriting completely.

Example:
ob_start();
session_start();
echo '<a href=".">self link</a>';
$data = ob_get_contents();
ob_end_clean();
echo $data;

In the example above, URL rewriting will never occur. In fact, rewriting would occur if you ended the buffering envelope using ob_end_flush(). It seems to me that rewriting occurs in the very same buffering envelope where the session gets started, not at the final output stage.

If you need a scenario like the one above, using an "inner envelope" will help:

ob_start();
ob_start(); // add the inner buffering envelope
session_start();
echo '<a href=".">self link</a>';
ob_end_flush(); // closing the inner envelope will activate URL rewriting
$data = ob_get_contents();
ob_end_clean();
echo $data;

In case you're interested or believe like me that this is rather a design flaw instead of a feature, please visit bug #35933 (http://bugs.php.net/bug.php?id=35933) and comment on it.
To Top