2009-08-31 12 views
6

Estoy usando la línea de comandos PHP para construir algunos archivos fuera de línea. Para capturar la salida del script que utilizo el material ob_start estándar:Imprimir en el terminal mientras utilizo el búfer de salida en scripts CLI PHP

ob_start(); 
// Echo lots of stuff 
$content = ob_get_contents(); 
// Now the $content can be written to a file 

Sin embargo, también quiero imprimir algunos mensajes al terminal (por ejemplo, advertencias) mientras recoger la "salida principal" en el buffer. ¿Hay alguna forma de hacer esto? No parece posible pausar el almacenamiento en memoria intermedia durante un tiempo para imprimir los mensajes del terminal, y luego continuar el almacenamiento en búfer desde donde quedó. ¿Hay alguna solución para esto?

Respuesta

8

Sólo tiene que escribir en STDOUT o STDERR (ambas constantes que contienen recursos apuntador de archivo) utilizando fputs():

ob_start(); 
echo 'Output buffer'; 
fputs(STDOUT, "Log message"); 
$x = ob_get_contents(); 
ob_end_clean();; 

echo "X = $x"; 
5

Utilice la php://stderr corriente:

$f = fopen('php://stderr', 'w'); 
fputs($f, 'Output'); 

EDIT: Además, en CLI, hay una predefined STDERR constant:

fputs(STDERR, 'Output'); 
2

Es posible "pausar" un buffer de salida. Escribe el contenido del búfer en una variable y finaliza el búfer sin enjuagar. Escriba alguna salida sin buffer, y llame a ob_start() nuevamente. Este método usa concatenación de cadenas, y es un método relativamente sucio. Prefiero los otros métodos sobre los míos por esta razón.

Pero en cualquier caso, aquí hay un pequeño ejemplo de trabajo:

<?php 
ob_start(); 
    echo 'Buffered line 1.<br>'; 
$ob = ob_get_contents(); 
ob_end_clean(); 

echo 'Non-buffered line.<br>'; 

ob_start(); 
    echo 'Buffered line 2.<br>'; 
$ob .= ob_get_contents(); 
ob_end_clean(); 

echo 'Non-buffered line.<br>'; 

ob_start(); 
    echo 'Buffered line 3.<br>'; 
$ob .= ob_get_contents(); 
ob_end_clean(); 

echo 'Non-buffered line.<br>'; 

echo $ob; 
?> 
Cuestiones relacionadas