現在の位置: ホーム> 最新記事一覧> Stream_get_filtersを使用してファイルフローフィルターを取得し、パフォーマンスの最適化を実行します

Stream_get_filtersを使用してファイルフローフィルターを取得し、パフォーマンスの最適化を実行します

gitbox 2025-05-19

PHPでは、ストリーム(ファイル、ネットワーク、メモリなど)に読み取られたり書かれたりしたときに、データを動的に変換または処理できる非常に強力なツールです。簡単な例を示すために、ファイルを読み取るときにコンテンツを自動的に圧縮、減圧、エンコード、さらにはフィルタリングすることもできます。

PHPプログラムのパフォーマンスをより適切に最適化するために、現在のシステムで使用可能なストリームフィルターを知る必要があり、その後、 stream_get_filters()関数を使用できます。

stream_get_filtersとは何ですか?

Stream_Get_Filters()は、現在のシステムによって登録されているすべてのストリームフィルターのリストを返すためのPHPに組み込まれた機能です。その基本的な使用法は非常に簡単です:

 $filters = stream_get_filters();
print_r($filters);

出力は次のようになるかもしれません:

 Array
(
    [0] => string.rot13
    [1] => string.toupper
    [2] => string.tolower
    [3] => convert.iconv.*
    [4] => convert.*
    [5] => zlib.*
    [6] => bzip2.*
)

これらのフィルターの名前は、stream_filter_append()またはstream_filter_prend()で使用して、フィルターをストリームに動的に接続できます。

フローフィルターを使用してパフォーマンスを向上させる方法は?

Stream_Get_Filters()自体は単なるリストですが、フィルターを合理的に使用すると、データ処理フローを大幅に最適化し、コードの複雑さを減らし、I/O効率を向上させることができます。

ここにいくつかの最適化の提案と例があります:

1 ??手動ループ処理は避けてください

読み取りファイルコンテンツを圧縮またはエンコードする必要がある場合は、時間のループを使用して処理する必要はありませんが、フィルターを直接使用できます。

たとえば、自動GZIP圧縮ファイルの書き込み:

 $filename = 'example.txt.gz';
$fp = fopen($filename, 'w');
stream_filter_append($fp, 'zlib.deflate', STREAM_FILTER_WRITE);
fwrite($fp, 'これは圧縮する必要があるテキストです。');
fclose($fp);

このコードは、GZIP圧縮のexample.txt.gzファイルにデータを直接書き込み、手動圧縮と複数のファイル操作を回避し、パフォーマンスを改善します。

2 ??中間ストレージを削減します

UTF-8エンコードされたテキストファイルをISO-8859-1エンコードストレージに変換する必要があるとします。最初にメモリに読んでから、 Iconv()を使用して変換する必要はありませんが、フィルターを直接使用します。

 $source = fopen('utf8file.txt', 'r');
$target = fopen('convertedfile.txt', 'w');
stream_filter_append($target, 'convert.iconv.UTF-8/ISO-8859-1', STREAM_FILTER_WRITE);

while (!feof($source)) {
    $line = fgets($source);
    fwrite($target, $line);
}

fclose($source);
fclose($target);

3 ??カスタムフィルターと組み合わせて

PHPは、カスタムフローフィルターの登録を許可します。これは、ログフィルタリング、敏感な単語の交換などの特定のビジネスシナリオに特に役立ちます。

 class UpperCaseFilter extends php_user_filter {
    function filter($in, $out, &$consumed, $closing) {
        while ($bucket = stream_bucket_make_writeable($in)) {
            $bucket->data = strtoupper($bucket->data);
            $consumed += $bucket->datalen;
            stream_bucket_append($out, $bucket);
        }
        return PSFS_PASS_ON;
    }
}

// フィルターを登録します
stream_filter_register('string.uppercase', 'UpperCaseFilter');

// フィルターの使用
$fp = fopen('php://output', 'w');
stream_filter_append($fp, 'string.uppercase');
fwrite($fp, 'hello gitbox.net!');
fclose($fp);

出力は次のとおりです。

 HELLO GITBOX.NET!

まとめ

stream_get_filters()は、パフォーマンスの最適化の出発点にすぎません。これは、どのツールが利用可能かを理解するのに役立ち、実際の最適化は次のとおりです。

?組み込みフィルターを使用して手動データ処理を削減します
?冗長なメモリとI/O操作を避けてください
?ビジネスシナリオに適合するようにカスタムフィルターを書き込んで適用します

これらの方法により、ファイルフロー、ネットワークフロー、メモリフロー、その他のシナリオの処理におけるPHPのパフォーマンスを大幅に改善できます。

詳細を知りたい場合は、公式ドキュメントを確認してください。
https://www.gitbox.net/manual/en/function.stream-get-filters.php