It seems that while using output buffering, an included file which calls die() before the output buffer is closed is flushed rather than cleaned. That is, ob_end_flush() is called by default.
<?php
// a.php (this file should never display anything)
ob_start();
include('b.php');
ob_end_clean();
?>
<?php
// b.php
print "b";
die();
?>
This ends up printing "b" rather than nothing as ob_end_flush() is called instead of ob_end_clean(). That is, die() flushes the buffer rather than cleans it. This took me a while to determine what was causing the flush, so I thought I'd share.
Funciones de Control de Salida
Introducción
Las funciones de Control de Salida le permiten controlar cuándo es enviada la salida desde el script. Esto puede resultar útil en muchas situaciones diferentes, especialmente si necesita enviar cabeceras al navegador después de que su script ha comenzado a enviar datos. Las funciones de Control de Salida no afectan las cabeceras enviadas usando header() o setcookie(), sólo funciones como echo() y los datos entre bloques de código PHP.
Note: Cuando se actualice desde PHP 4.1.x (y 4.2.x) a 4.3.x, debido a un error en versiones anteriores, debe asegurarse de que implict_flush tenga el valor OFF en su archivo php.ini, de otra forma cualquier salida resultado de ob_start() no será escondida.
Requisitos
No se necesitan bibliotecas externas para construir esta extensión
Instalación
No se necesita ninguna instalación para usar estas funciones, son parte del núcleo de PHP.
Configuración en tiempo de ejecución
El comportamiento de estas funciones está afectado por los valores definidos en php.ini.
| Nombre | Predeterminado | Modificable | Cambios |
|---|---|---|---|
| output_buffering | "0" | PHP_INI_PERDIR | |
| output_handler | NULL | PHP_INI_PERDIR | Disponible desde PHP 4.0.4. |
| implicit_flush | "0" | PHP_INI_ALL | PHP_INI_PERDIR en PHP <= 4.2.3. |
A continuación se presenta una corta explicación de las directivas de configuración.
- output_buffering boolean/integer
-
Puede habilitar el uso de búferes de salida para todos los archivos, definiendo esta directiva como 'On'. Si desea limitar el tamaño del búfer a cierta cantidad - puede usar un número máximo de bytes, en lugar de 'On', como valor para esta directiva (p.ej., output_buffering=4096). A partir de PHP 4.3.5, esta directiva siempre tiene el valor Off en PHP-CLI.
- output_handler string
-
Puede redireccionar toda la salida de sus scripts a una función. Por ejemplo, si establece el valor de output_handler a mb_output_handler(), la codificación de caracteres será convertida de forma transparente a la codificación especificada. Al definir cualquier gestor de salida, el control mediante búferes se activa automáticamente.
Note: Usted no puede usar mb_output_handler() con ob_iconv_handler() al tiempo, y no puede usar ob_gzhandler() y zlib.output_compression al tiempo.
Note: Solo funciones integradas del lenguaje pueden ser usadas con esta directiva. Para funciones definidas por el usuario, use ob_start().
- implicit_flush boolean
-
FALSE por defecto. Cambiar este valor a TRUE le indica a PHP que debe decirle a la capa de salida que se vacíe automáticamente después de cada bloque de salida. Esto es equivalente a llamar la función de PHP flush() después de todas y cada una de las llamadas a print() o echo(), y cada bloque HTML.
Cuando use PHP bajo un entorno web, el habilitar esta opción tiene unas implicaciones serias en el rendimiento, y por lo general se recomienda su uso únicamente para propósitos de depuración. Este valor es igual a TRUE por defecto cuando se opera bajo la SAPI CLI.
Vea también ob_implicit_flush().
Tipos de recursos
Esta extensión no tiene ningún tipo de recurso definido.
Constantes predefinidas
Esta extensión no tiene ninguna constante definida.
Ejemplos
Example#1 Ejemplo de Control de Salida
<?php
ob_start();
echo "Hola\n";
setcookie("nombre_cookie", "datos_cookie");
ob_end_flush();
?>
En el anterior ejemplo, la salida de echo() sería almacenada en el búfer de salida hasta que ob_end_flush() sea llamada. Entre tanto, la llamada a setcookie() almacena satisfactoriamente una cookie sin causar un error. (Normalmente, usted no puede enviar cabeceras al navegador después de que se han enviado datos.)
Ver también
Vea también header() y setcookie().
Table of Contents
- flush — Vaciar el búfer de salida
- ob_clean — Limpiar (eliminar) el búfer de salida
- ob_end_clean — Limpiar (eliminar) y deshabilitar los búferes de salida
- ob_end_flush — Volcar (enviar) el búfer de salida y deshabilitar el uso del búfer
- ob_flush — Vaciar (enviar) el búfer de salida
- ob_get_clean — Obtener los contenidos del búfer actual y eliminar el búfer de salida actual
- ob_get_contents — Devolver el contenido del búfer de salida
- ob_get_flush — Volcar el búfer de salida, devolverlo como una cadena y deshabilitar el uso de búferes de salida
- ob_get_length — Devolver la longitud del búfer de salida
- ob_get_level — Devolver el nivel de anidamiento del mecanismo de búferes de salida
- ob_get_status — Obtener el status de los búferes de salida
- ob_gzhandler — Llamada de retorno de ob_start para comprimir mediante gzip el búfer de salida
- ob_implicit_flush — Habilitar/deshabilitar el volcado implícito
- ob_list_handlers — Listar todos los gestores de salida en uso
- ob_start — Habilitar el uso de búferes de salida
- output_add_rewrite_var — Agregar valores de re-escritura de URL
- output_reset_rewrite_vars — Reestablecer los valores del mecanismo de re-escritura de URLs
Control de Salida
30-Jun-2007 05:02
28-Jan-2007 10:45
Please note that most browsers don't display a table unless they passed its end-tag "</table>".
Thats why using this feature in HTML-tables might not result in what you expected...
best regards
BasicArtsStudios
21-Jan-2007 08:39
Sometimes you might not want to include a php-file under the specifications defined in the functions include() or require(), but you might want to have in return the string that the script in the file "echoes".
Include() and require() both directly put out the evaluated code.
For avoiding this, try output-buffering:
<?php
ob_start();
eval(file_get_contents($file));
$result = ob_get_contents();
ob_end_clean();
?>
or
<?php
ob_start();
include($file);
$result = ob_get_contents();
ob_end_clean();
?>
which i consider the same, correct me if I'm wrong.
Best regards, BasicArtsStudios
16-Sep-2006 12:08
Unfortunately, the PHP guys didn't build support into any of the image output functions to return the image instead of outputting it.
Fortunately, we have output buffering to fix that.
<?
$im = imagecreatetruecolor(200, 200);
// Other image functions here...
ob_start();
imagepng($im);
$imageData = ob_get_contents();
ob_clean();
?>
You can now use the $imageData variable to either create another GD image, save it, put it in a database, make modifications to the binary, or output it to the user. You can easily check the size of it as well without having to access the disk...just use strlen();
08-Sep-2006 02:07
Now this just blew my mind. I had a problem with MySQL being incredibly slow on Windows 2003 running IIS... on ASP/VBScript pages. PHP is also installed on the server and so is Microsoft SQL 2005 Express. (Yes, we're running ASP, PHP, MySQL and MS SQL on the same Windows 2003 Server using IIS.)
I was browsing the internet for a solution and saw a suggestion that I change output_buffering to on if MySQL was slow for PHP pages. Since we also served PHP pages with MySQL from the same server, it caught my eye. For the hell of it, I went into php.ini and changed output_buffering to on and suddenly MySQL and ASP was faster... MySQL and PHP was faster... Microsoft SQL Server 2005 Express and ASP was faster.... everything was faster... even stuff that had no PHP!
And I didn't even have to restart IIS. As soon as I saved the php.ini file with the change, everything got faster.
Apparently PHP and MySQL and IIS are so intertwined somehow that changing the buffering setting really effects the performance of the entire server.
So, if you are having performance problems on Windows 2003 & IIS, you might try setting output_buffering = On in php.ini if you happen to have PHP installed. Having it set to off apparently effects the performance of Windows 2003 and IIS severely... even for webpages that do not use PHP or MySQL.
21-Aug-2006 11:30
Output buffering is set to '4096' instead of 'Off' or '0' by default in the php-5.0.4-10.5 RPM for Fedora Core release 4 (Stentz). This has cost me much time!
11-Jul-2006 04:00
In re to erwinX at darwineX dot nl:
Adding an ampersand (&) before the hash seems to work too (for me at least), i.e.: http://somedomain.tld/blah.php?arg=x&#something
I guess php then interperts it as an argument to the script. Might save some time and resources.
11-Nov-2005 03:35
[Concerns IE refusing to jump to a #something in the URL.]
I encoutered a bug in IE6/W2000 that can be solved by turning output buffering on.
Maybe it also helps in other situations/M$-OS, not sure.
Situation:
A page with a hash in the URL, and IE doesn't jump to that location.
Example:
http://www.bla.com/test.php#something
- In test.php the anchortag is placed normally like:
<a name="something"><br></a>
- test.php takes a few seconds to load because of heavy-duty database activity.
IE just ignores the hash #something.
It looks like IE 'forgets' the hash if it hasn't encoutered it YET in the HTML.
Turning output buffering on resolves that issue.
23-Jun-2005 09:25
I ran out of memory, while output buffering and drawing text on imported images. Only the top portion of the 5MP image was displayed by the browser. Try increasing the memory limit in either the php.ini file( memory_limit = 16M; ) or in the .htaccess file( php_value memory_limit "16M" ). Also see function memory_get_usage() .
10-Jul-2004 03:53
For those who are looking for optimization, try using buffered output.
I noticed that an output function call (i.e echo()) is somehow time expensive. When using buffered output, only one output function call is made and it seems to be much faster.
Try this :
<?php
your_benchmark_start_function();
for ($i = 0; $i < 5000; $i++)
echo str_repeat ("your string blablabla bla bla", (rand() % 4) + 1)."<br>\n";
echo your_benchmark_end_function();
?>
And then :
<?php
your_benchmark_start_function();
ob_start ();
for ($i = 0; $i < 5000; $i++)
echo str_repeat ("your string blablabla bla bla", (rand() % 4) + 1)."<br>\n";
echo your_benchmark_end_function();
ob_end_flush ();
?>
01-Apr-2004 02:49
There is a problem in MSIE 5.5,6 with regards to Page compression. Users might experience pages not loading completely, or just a blank page.
This articles you are looking for is what you're looking for:
Microsoft Knowledge Base Article - 312496 (for MSIE 6)
Microsoft Knowledge Base Article - 313712 (for MSIE 5.5)
It states that you should upgrade to the latest MSIE Service Pack to fix the following problem:
Internet Explorer May Lose the First 2,048 Bytes of Data That Are Sent Back from a Web Server That Uses HTTP Compression
09-Jul-2003 02:44
Trying to benchmark your server when using output_buffering ?
Don't forget that the value 4096 in the php.ini will give you complete different loadtimes compares to the value of 1.
In the first case the output will be sent after buffering 4096 and the loadtime timed at the end of the page will contain the loadtime needed to download the complete page in the clientbrowser while the second value will contain the loadtime needed to place the complete page in the buffer. The time needed for sending is not clocked.
This can be very frustrating if you don't see the differance between server and the 1st is using 4096 instead of 1.
Although technically much faster than the second server the second server was providing much better loadtime results.
This result will grow when using large amounts of output.
But this becomes interesting if you want to measure the time needed for the page to be loaded for the client.
08-Feb-2001 09:17
A few tutorials exist on this subject :
* http://www.zend.com/zend/art/buffering.php
* http://www.phpbuilder.com/columns/argerich20010125.php3
