2011-05-15 15 views
12

Yo uso de búferes de salida para la compresión gzip y el acceso a lo que se puso antes en un script PHP:Cómo determinar si ob_start(); se ha llamado ya

if(!ob_start("ob_gzhandler")) ob_start(); 

Ahora bien, si esa secuencia de comandos se incluye en otro script, donde ob_start() ya está en uso recibo una advertencia:

advertencia: ob_start() [ref.outcontrol]: gestor de salida 'ob_gzhandler' no se puede usar dos veces en el nombre de archivo en la línea n

Así que me gustaría probar wether ob_start() ya ha sido llamado. Creo que ob_get_status() debería ser lo que necesito, pero ¿cuál es la mejor manera de usarlo en las pruebas para esto?

Respuesta

12

ob_get_level devuelve el número de manipuladores de control de salida activo y ob_list_handlers devuelve una elevación de los manipuladores. Por lo que podría hacer esto:

if (!in_array('ob_gzhandler', ob_list_handlers())) { 
    ob_start('ob_gzhandler'); 
} else { 
    ob_start(); 
} 

Aunque en general se puede llamar ob_start cualquier número de veces que desea, utilizando ob_gzhandler como manejador puede no como era de comprimir los datos ya comprimidos.

+0

Estaba irritado por el [comentario en el manual] (http://www.php.net/manual/en/function.ob-get-level.php) que dice "A veces, ob_get_level() puede estar apagado por 1 porque al comienzo del script, devolverá 1 incluso si ob_start() nunca se ha llamado ". Entonces, ¿es esta una manera confiable de contar? –

+0

@CO: Probablemente se deba a [output_buffering] (http://php.net/manual/en/outcontrol.configuration.php#ini.output-buffering): "If [output_buffering] (http: // php .net/manual/es/outcontrol.configuration.php # ini.output-buffering) está habilitado o se utilizó una función anónima con 'ob_start()', 'ob_list_handlers()' devolverá "' default output handle''. " – Gumbo

9
if (ob_get_level()) 
    echo "ob already started"; 
+0

Estaba irritado por el [comentario en el manual] (http://www.php.net/manual/en/function.ob-get-level.php) que dice "A veces, ob_get_level() puede estar apagado en 1 porque al comienzo del script, devolverá 1 incluso si ob_start() nunca se ha llamado ". Entonces, ¿es esta una manera confiable de contar? –

+0

@ C.O. He leído el comentario, pero esto no es verdad. Devolverá 0 incluso si se llama al comienzo del script. Puedes echar un vistazo a mi ejemplo: http://codepad.org/SrZ4YdQn – AndersTornkvist

+1

** Es ** cierto. Se topó con él la semana pasada en un servidor compartido. La mejor manera de manejarlo es iniciar su código con 'if (ob_get_level()) ob_end_clean();' antes de 'ob_start()' – Michel

3

¿Qué hay de usar de esta manera?

if (ob_get_level() == 0) ob_start();

+0

Estaba irritado por el [comentario en el manual] (http://www.php.net/manual/en/function.ob-get-level.php) que dice "A veces, ob_get_level() puede estar apagado por 1 porque al comienzo del script, devolverá 1 incluso si ob_start() nunca se ha llamado ". Entonces, ¿es esta una manera confiable de contar? –

+0

Al menos no hay ningún informe de error para este tipo de problema. Puede ser la falta del comentarista. http://bugs.php.net/search.php?cmd=display&search_for=ob_get_level&x=0&y=0 –

+0

Sí, probablemente, pero ese comentario fue lo que me llevó a comenzar esta pregunta. Quería obtener algunas opiniones. Así que gracias. –

4

general:

if (ob_get_status()) { 
    // ob started 
} 

más específica

$status = ob_get_status(); 
if ($status['name']=='ob_gzhandler') { 
// ob named ob_gzhandler started 
} 
+0

Eso era lo que estaba buscando. Gracias. Voy a usar la sugerencia de Gumbo anterior, creo. –

Cuestiones relacionadas