2009-08-31 18 views
6

私はコマンドラインPHPを使用していくつかのファイルをオフラインでビルドしています。がバッファに「メイン出力」を収集しながらCLI PHPスクリプトで出力バッファリングを使用しているときに端末に出力する

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

しかし、私はまた、(例えば、警告)端末にいくつかのメッセージを印刷したい:私は標準のob_startのものを使用するスクリプトの出力をキャプチャします。これを行う方法はありますか?ターミナルメッセージを印刷するために一時的にバッファリングを一時停止してから、どこに残っているかのバッファリングを続けることはできないようです。このための回避策はありますか?

答えて

8

ただ、両方の定数は、ファイルポインタリソースを含む(STDOUTまたはSTDERRへの書き込みを)を使用してfputs():

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

echo "X = $x"; 
5

php://stderrストリームを使用します

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

はEDIT:また、CLIで、predefined STDERR constantがある:

fputs(STDERR, 'Output'); 
2

出力バッファを「一時停止」することは可能です。バッファの内容を変数に書き込み、バッファをフラッシュせずに終了します。バッファされていない出力を書き、ob_start()をもう一度呼び出します。このメソッドは文字列の連結を使用し、比較的汚いメソッドです。私はこの理由のために私自身の上に他の方法を好む。

しかし、いずれの場合も、ここで小さな作業例です:

<?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; 
?> 
関連する問題