2009-08-31 3 views
6

J'utilise la ligne de commande PHP pour créer des fichiers hors ligne. Pour capturer la sortie de script que j'utilise les trucs standards ob_start:Impression sur un terminal en utilisant la mise en tampon de sortie dans les scripts PHP CLI

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

Cependant, je veux aussi imprimer des messages vers le terminal (par exemple, les avertissements) tout collecte de la « sortie principale » dans le tampon. Y a-t-il un moyen de faire cela? Il ne semble pas possible d'interrompre la mise en mémoire tampon pendant un certain temps pour imprimer les messages du terminal, puis de poursuivre la mise en mémoire tampon à l'endroit où elle se trouvait. Y at-il une solution de contournement pour cela?

Répondre

8

Il suffit d'écrire à STDOUT ou STDERR (les deux constantes qui contiennent des ressources de pointeur de fichier) en utilisant fputs():

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

echo "X = $x"; 
5

Utilisez le flux php://stderr:

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

EDIT: En outre, dans CLI, il y a une predefined STDERR constant:

fputs(STDERR, 'Output'); 
2

Il est possible de «mettre en pause» un tampon de sortie. Ecrivez le contenu du buffer dans une variable et terminez le buffer sans vidage. Écrivez une sortie non-buffered, et appelez ob_start() encore. Cette méthode utilise la concaténation de chaînes, et c'est une méthode relativement sale. Je préfère les autres méthodes au-dessus de la mienne pour cette raison.

Mais dans les deux cas, voici un petit exemple de travail:

<?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; 
?> 
Questions connexes