Uso del Buffer en PHP

Tutoriales desarrollados por los usuarios de ABCdatos: ¡Aprende y enseña!

Moderador: Moderadores

Responder
GooFerCarlos
Novat@
Mensajes: 1
Registrado: Mié Mar 25, 2015 5:10 pm

Uso del Buffer en PHP

Mensaje por GooFerCarlos » Mié Mar 25, 2015 6:13 pm

Hola a todos, mas que en tutorial es un apunte que después de mucho tiempo ya programando veo, al menos públicamente, no se usa la gestión del buffer de salida en PHP, es una muy buena optimización para la velocidad en PHP.
Esto no lo encontré en publicado fácilmente y por eso lo quiero compartir aquí, para darlo mas a conocer públicamente, ahora paso a la explicación y método.

En PHP estamos acostumbrados a, después de una ejecución con un resultado hacer la salida ECHO para mostrarlo en pantalla al usuario, muy posiblemente se han tenido que utilizar varias variables para obtener el resultado, a su misma vez es muy habitual el hacer ECHO con contendido dependiente del valor de varias de las variables obtenidas, por ejemplo de una consulta SQL a una BBDD. Todo ese trabajo que no esta mal hecho por supuesto, se puede optimizar para que la respuesta sea mas rápida, el ECHO con muchas variables relentiza ya que se han de interpretar y obtener sus valores para después imprimir la salida en la pantalla, aquí en donde entra la gestión del buffer de salida. Se que a muchos no os voy a descubrir la dinamita ni mucho menos, espero contribuir a los que comienzan en este lenguaje a tomar encuenta el detalle de optimizar su código de cara a la velocidad, para a desarrollar un ejemplo muy simple para que se vea el concepto.
Ejemplo con una cosnulta SQL típica para listar resultados, simularemos obtener 1000 resultados.
<?php
$host = "localhost";
$db = "mydbTest";
$user = "root";
$pass = "1234";
$conexion=mysql_connect($host, $user, $pass);
$datos=mysql_select_db($db);
$result = mysql_query("select * from productos '"); < -- suponemos que tiene 1000 productos
echo '<ul>'; < -------------------------------------------------- Abro etiqueta para crear una lista desordenada.
while($producto = mysql_fetch_assoc($result)){
echo"<li>$prodcuto[nombre]</li>"; <--------------- con el bucle lleno la lista con los resultados de la consulta SQL
}
echo'</ul>';
mysql_close($conexion);
?>
Bien, con el código de arriba se recibirá una lista con los 1000 supuestos productos pero a una velocidad mas lenta en pantalla que si hacemos los siguiente:
<?php
ob_start(); <--------------------------------------------------- Activa el almacenamiento en búfer de la salida
$host = "localhost";
$db = "mydbTest";
$user = "root";
$pass = "1234";
$conexion=mysql_connect($host, $user, $pass);
$datos=mysql_select_db($db);
$result = mysql_query("select * from productos '"); < -- suponemos que tiene 1000 productos
echo '<ul>'; < -------------------------------------------------- Abro etiqueta para crear una lista desordenada.
while($producto = mysql_fetch_assoc($result)){
echo"<li>$prodcuto[nombre]</li>"; <--------------- con el bucle lleno la lista con los resultados de la consulta SQL
}
echo'</ul>';
$productos = ob_get_contents(); <------------------------ esta función devuelve el contenido del búfer de salida el cual nosotros lo metemos en una variable|
ob_end_clean(); <-------------------------------------------- Limpiar (eliminar) el búfer de salida y deshabilitar el almacenamiento en el mismo |
ob_start("ob_gzhandler"); < -------------------------------- Función de llamada de retorno de ob_start para comprimir el búfer de salida con gzip |<----------------------- esta es la optimizacion
echo $productos; <------------------------------------------- Con la llamada anterior comprimimos el nuevo buffer de salida, ahora es solo una variable |
ob_end_flush(); <--------------------------------------------- Volcar (enviar) el búfer de salida y deshabilitar el almacenamiento en el mismo |
mysql_close($conexion);
?>
¿Qué hemos conseguido?, en el primer caso a cada vuelta de bucle se envia el resultado ocupando memoria y recursos del servidor y si la conexión se relentiza por alguna causa digamos que se pueden dar saltos en la entrega de datos. Con el segundo caso, cierto que es es necesario el mismo consumo de recursos pero no se envía nada, el buffer se llena secuencialmente con las salidas ECHO, después el contenido de ese buffer los contenemos en una sola variable lo cual es mas optimizado, después para acabar de optimizar, en el envio hacemos la llamada a la función ob_gzhandler para comprimir en Gzip la salida y después enviarlo, no es lo mismo enviar 1000 salidas de 1kb que una de 10k, es mas optimizado y mejor una sola de 10k.
No se hasta donde os podra ayudar a alguno, si estaréis de acuerdo o no conmigo, yo lo tengo mas que ultilizado y el cambio de la velocidad de respuesta es innegable, también, y ya de paso, que si esto esta muy bien explicado por otros, existen mejoras a utilizar cuando se programa en PHP. No cito fuentes de donde saque esto porque hace ya mucho tiempo, años, que lo vi pero no me acuerdo donde, ni de quien.

saludos

perrubi
Novat@
Mensajes: 3
Registrado: Mié Sep 23, 2015 10:35 am
Contactar:

Re: Uso del Buffer en PHP

Mensaje por perrubi » Mié Sep 23, 2015 10:38 am

Gracias por el tuto, me vino de perlas
[url=http://www.fiuxy.com/]Fiuxy[/url]

Avatar de Usuario
Lautaro Navarro

Re: Uso del Buffer en PHP

Mensaje por Lautaro Navarro » Lun Mar 05, 2018 7:24 pm

Muy buen aporte!
Lo voy a tener en cuenta, muchas gracias!

Richi
Junior
Mensajes: 6
Registrado: Mié Abr 25, 2018 9:41 am

Re: Uso del Buffer en PHP

Mensaje por Richi » Mié Abr 25, 2018 10:31 am

Info muy prácticaDerechos herencia Además bastante claro y con aclaraciones. Me servirá bien de base y ya si tengo dudas concretas buscaré al respecto ^^

Responder