現在の位置: ホーム> 最新記事一覧> stream_bucket_make_writableを使用して、ストリーム内のデータブロックを読み取ります

stream_bucket_make_writableを使用して、ストリーム内のデータブロックを読み取ります

gitbox 2025-05-29

PHPでストリームを処理する場合、カスタマイズされたバッファリングを実装するためにデータブロック(バケット)の読み取りなど、より基礎となるストリームのデータを操作する必要がある場合があります。 PHPのストリームフィルターメカニズムは、 Stream_Bucket_Make_Writableがストリームのバッファーからデータブロックを取得できる重要な関数であり、それらを読み取り、操作できる強力なインターフェイスを提供します。

この記事では、 Stream_Bucket_Make_Writeableの役割、PHPストリームのデータブロックの読み取り方法、および実用的な例を介して特定のアプリケーションを実証する方法を詳細に紹介します。


1. stream_bucket_make_writableとは何ですか?

Stream_Bucket_Make_Writableは、PHP Streamフィルター関連の機能であり、 PHP_STREAM_BUCKET構造の操作インターフェイスに属します。その機能は、ストリームの内部バッファーからデータブロック(バケット)を「取り出す」ことで、書き込み可能なバケットオブジェクトを返します。このバケットには、現在利用可能なデータが含まれており、直接読み取ったり変更できます。

この関数は、カスタムストリームフィルターの実装で一般的に使用されているため、開発者が圧縮、暗号化、デコード、その他の操作などのストリーミングデータを細かく制御できるようになります。


2。データブロックを読み取る基本的なプロセス

stream_bucket_make_writableを使用してデータブロックを読み取るには、ほぼ次の手順が必要です。

  1. カスタムフローフィルターを作成して登録します<br> フローフィルタークラスは、 php_user_filterを継承し、フィルターメソッドをオーバーライドする必要があります。

  2. Stream_bucket_make_writeable内部フィルターメソッドを呼び出します
    この関数を通してバケツを取得して、データからデータを読み取ります。

  3. 読み取りデータブロックの処理<br> データを読み取り、変更、または次のフィルターに渡すことができます。

  4. 処理結果を返し、フィルター操作を完了します


3。実用的な例:カスタムストリームフィルターはデータブロックを読み取ります

次の例は、シンプルなカスタムストリームフィルターを定義し、フィルターメソッドでstream_bucket_make_writableを介してデータブロックを読み取り、内容を印刷する方法を示しています。

 <?php
class MyReadFilter extends php_user_filter {
    public function filter($in, $out, &$consumed, $closing) {
        // すべてのデータブロックをループします
        while ($bucket = stream_bucket_make_writeable($in)) {
            // 読む bucket データ
            $data = $bucket->data;

            // 这里我们简单打印読む到的数据
            echo "読む数据块内容: " . $data . "\n";

            // マーカーで消費されるバイト数
            $consumed += $bucket->datalen;

            // 意思 bucket 次のフィルターまたは出力ストリームに渡します
            stream_bucket_append($out, $bucket);
        }
        return PSFS_PASS_ON;
    }
}

// カスタムフィルターを登録します
stream_filter_register("myreadfilter", "MyReadFilter") or die("Failed to register filter");

// 使用の例:从文件流中読む数据并应用过滤器
$fp = fopen("gitbox.net/sample.txt", "r");

// カスタムフィルターをストリームに接続します
stream_filter_append($fp, "myreadfilter", STREAM_FILTER_READ);

// 読む文件内容,フィルターをトリガーします filter 方法
while (!feof($fp)) {
    fread($fp, 8192);
}

fclose($fp);
?>

4。キーノート

  • Stream_bucket_make_writable($ in) :入力バケットリストからバケツを取り出して返品します。返されたバケットオブジェクトには、プロパティデータ(String Data)とDatalen (データの長さ)が含まれています。

  • データを読んだ後、 Stream_bucket_append($ out、$ bucket)を呼び出して、バケットを出力チェーンに渡して、ストリーム処理チェーンの通常の実行を確保する必要があります。

  • $消費されたのは、ストリームフィルターに消費されるデータブロックの数を伝えるために使用され、ストリームバッファの管理に影響します。

  • 通常、フィルターの戻り値は、 psfs_pass_onを使用して通常のデータ送信を示すために使用されます。


5。概要

Stream_bucket_make_writableは、PHPストリームフィルターメカニズムでストリームデータブロックを読み取るためのコアインターフェイスであり、開発者がストリームバッファーでデータを直接操作できるようにします。カスタムストリームフィルターを介して、リアルタイム圧縮、暗号化、ログモニタリングなど、複雑なデータ処理ロジックを実装できます。

ストリームの基礎となるデータブロック操作をマスターすると、大規模なファイルとネットワークストリーミングデータを処理する際に、より柔軟性とパフォーマンスを高めることができます。

開発中にストリーム操作でパフォーマンスボトルネックに遭遇したり、ストリームで細かいデータ処理を実行する必要がある場合は、 Stream_Bucket_Make_Writableおよび関連するストリームフィルターAPIを詳細に学習および適用することをお勧めします。