2012-05-04 11 views
11

he revisado el manual php sobre ob_start() ob_end_clean() ob_end_flush(). Y he visto un ejemplo diferente sobre el tema, de todos modos modifiqué el ejemplo pero estoy confundido en este punto. aquí está el guión¿Qué pasó cuando uso multi ob_start() sin ob_end_clean() o ob_end_flush()?

ob_start(); 
echo "Hello x, "; 

ob_start(); 
echo "Hello y, "; 

ob_start(); 
echo "Hello z, "; 

ob_start(); 
echo "Hello World"; 
$ob_2 = ob_get_contents(); 
ob_end_clean(); 

echo "Galaxy"; 
$ob_1 = ob_get_contents(); 
ob_end_clean(); 

echo " this is OB_1 : ".$ob_1; 
echo "<br> and this is OB_2 : ".$ob_2; 

y la salida de este script es:

Hola x, Hola Y, esto es OB_1: Hola z, Galaxy

y esto es OB_2: Hello World

--------------------------------------------

¿Por qué la salida no es así?

esto es OB_1: Hola x, y Hola, Hola z, Galaxy

y esto es OB_2: Hello World

Y lo que es el punto que han perdido?

Respuesta

17

Los búfers de salida funcionan como una pila. Usted crea un búfer y hace eco de "Hola x" en él, luego crea otro búfer y repite "Hola y" en él, luego crea un tercer búfer y repite "Hola z" en él. El "Hola mundo" entra en un cuarto buffer, que se cierra con la llamada al ob_end_clean(), por lo que regresa al tercero. Cuando llamas al ob_get_contents() después de hacer eco de "Galaxy", obtienes los contenidos de ese tercer buffer.

Si llama al ob_get_contents() nuevamente al final de este código, obtendrá el "Hola y", que está en el segundo buffer. Y si ob_end_close() y luego ob_get_contents() nuevamente, obtendrá el "Hola x" desde el primer buffer.

+2

Estoy tratando de usar flush(), ob_flush() etc. durante una hora, tratando de encontrar fuentes útiles. Usted es el primero que * explicó * qué está pasando. +1 para una respuesta simple pero muy útil. –

32

Anotaré su código para explicar lo que está sucediendo. Todos los buffers de salida se inicializan para estar vacíos, que es estándar:

ob_start(); // open output buffer 1 
echo "Hello x, "; // echo appended to output buffer 1 

ob_start(); // open output buffer 2 
echo "Hello y, "; // echo appended output buffer 2 

ob_start(); // open output buffer 3 
echo "Hello z, "; // echo appended to output buffer 3 

ob_start(); // open output buffer 4 
echo "Hello World"; // echo appended output buffer 4 
$ob_2 = ob_get_contents(); // get contents of output buffer 4 
ob_end_clean(); // close and throw away contents of output buffer 4 

echo "Galaxy"; // echo appended to output buffer 3 
$ob_1 = ob_get_contents(); // get contents of output buffer 3 
ob_end_clean(); // close and throw away contents of output buffer 3 

// at this point, $ob_2 = "Hello World" and $ob_1 = "Hello z, Galaxy" 
// output buffer 1 = "Hello x," and output buffer 2 = "Hello y," 

echo " this is OB_1 : ".$ob_1; // echo appended to output buffer 2 

// output buffer 2 now looks like "Hello y, this is OB_1 : Hello z, Galaxy" 

echo "<br> and this is OB_2 : ".$ob_2; // echo appended to output buffer 2 

// output buffer 2 now looks like: 
// "Hello y, this is OB_1 : Hello z, Galaxy<br> and this is OB_2 : Hello World" 

// output buffer 2 implicitly flushed by end of script 
// output from buffer 2 captured by (appended to) output buffer 1 
// output buffer 1 now looks like: 
// "Hello x, Hello y, this is OB_1 : Hello z, Galaxy<br> and this is OB_2 : Hello World" 
// output buffer 1 implicitly closed by end of script. This is when your output 
// actually gets printed for this particular script. 
+1

gracias, tan claro :) –

+1

lo siento, realmente he olvidado –

+1

esta es una gran explicación jeje. :RE – gumuruh