PHPでは、ストリーム(ファイル、ネットワーク、メモリなど)に読み取られたり書かれたりしたときに、データを動的に変換または処理できる非常に強力なツールです。簡単な例を示すために、ファイルを読み取るときにコンテンツを自動的に圧縮、減圧、エンコード、さらにはフィルタリングすることもできます。
PHPプログラムのパフォーマンスをより適切に最適化するために、現在のシステムで使用可能なストリームフィルターを知る必要があり、その後、 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効率を向上させることができます。
ここにいくつかの最適化の提案と例があります:
読み取りファイルコンテンツを圧縮またはエンコードする必要がある場合は、時間のループを使用して処理する必要はありませんが、フィルターを直接使用できます。
たとえば、自動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ファイルにデータを直接書き込み、手動圧縮と複数のファイル操作を回避し、パフォーマンスを改善します。
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);
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