2011-03-06 9 views
4

はストリーム状にPHPの標準出力のデータをフィルタリングすることが可能です:PHPの標準出力データをストリームフィルタリングする方法は?

standard output ⟶ output filter ⟶ standard output 

は、私はすでにob_startの意識です。しかし、出力全体を一度に処理するのではなく、php_user_filterなどのストリームを使用して処理したいと考えています。

+0

したがって、標準出力に変更されるコールバックを定義することを覚えておいてください。はいの場合、そのコールバックはいつ呼び出されますか(頻度) – Jon

+0

@Jon:呼び出しの数は、出力チャンクの数(例えば、 'echo'パラメータ、出力の行、またはいくつかの内部バッファなど)によって決まる可能性があります。あるいは単に呼び出されたばかりであり、各チャンクを処理する準無限ループ中にチェックできるストリーム状態が存在します。 – Gumbo

答えて

3

私はこれが何であるかはよく分かりませんが、回答を投稿しない理由はありません。

ob_start()コールバックを使用して、部分のコンテンツを処理することができます。あなたがしなければならないのは、初期化直後にob_implicit_flush()に設定するだけです。今、通常のコールバックはシンプルでアウト機能ですが、あなたが望むようにはのような複雑にすることができます。

class ob_callback { 
    function __invoke($part, $end_flag_0x04) { 
     return "+$part"; 
     // or map to $stream->filter($in, $out, &$consumed, $closing) 
    } 
    function __destruct() { /* cleanup */ } 
} 

ob_start(new ob_callback, 2); 
ob_implicit_flush(TRUE); 

私はストリーム-yの使用がどのようになるかわかりません。しかし、PHPの標準出力を傍受する方法は他にありません。暗黙的なフラッシュはCLIでは機能しません。

0

あなたの質問が正しく分かっている場合は、ob_start()$chunk_sizeに2番目の引数を使用できます。

ob_start('my_callback', 1024);

上記の例では、出力バッファが1キロバイトに達するか、超えることが原因my_callback()たびに呼び出すことになります。個別の文で数キロバイトを吐き出すと、my_callback()が何度もトリガされます。単一の文字列として数キロバイトを出力していた場合は、最大でmy_callback()を出力ごとに1回しか起動できないので、これは役に立ちません。

関連する問題