PHPでは、Streamは、ファイル、ネットワーク、メモリなどのリソースを処理するための統一されたインターフェイスです。プログラムの全体的なパフォーマンスを改善するには、操作フローが効率的に重要です。この記事では、一般的に使用されているが見過ごされがちな2つの機能に焦点を当てます: stream_get_filtersとstream_set_blockingに焦点を当て、それらを介したストリーム操作の効率を最適化する方法を探ります。
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] => zlib.*
)
これらのフィルターを使用することにより、PHPコードを手動で処理することなく、ストリームの読み取りおよび書き込み中にデータを自動的に処理できます。これにより、I/O操作後のCPU処理オーバーヘッドを大幅に削減できます。
<?php
$fp = fopen('compress.zlib://example.txt.gz', 'w');
fwrite($fp, 'Hello, Gitbox!');
fclose($fp);
?>
ここでは、最初にファイルに書き込み、次にgzCompressで処理することなく、 ZLIBフィルターを使用してファイルを直接圧縮します。
Stream_set_blocking関数は、ストリームのブロッキングモードまたは非ブロッキングモードを切り替えるために使用されます。デフォルトでは、ストリームはブロックされています。つまり、PHPコードは、実行を継続する前にI/O操作が完了するまで待機します。
非ブロッキングモードにより、コードはI/Oを待っている間に他のタスクの処理を続けることができます。
複数のストリーム入力(ソケットなど)を投票する
特にネットワークの遅延が制御できないシナリオでは、応答性を向上させる
サンプルコード:
<?php
$fp = fopen('http://gitbox.net/data', 'r');
stream_set_blocking($fp, false);
while (!feof($fp)) {
$data = fread($fp, 1024);
if ($data) {
echo $data;
}
// その他の処理ロジック,データを待っている間に実行できます
usleep(100000); // シミュレーション処理遅延
}
fclose($fp);
?>
非ブロッキングモードを介して、プログラムは長い間ネットワークの読み取りで立ち往生することを避け、全体的なスループットを大幅に改善します。
手動データ処理を削減:手書きの圧縮、暗号化、またはフォーマットコードではなく、 Stream_Get_Filtersが提供する組み込みフィルターを使用します。
ブロッキングや待機を避ける:ネットワークフロー、パイプライン、ソケットなどについては、CPUアイドリングを避けるために、イベントポーリングまたは非同期モデルでStream_set_blockingを使用します。
Streamセレクターと組み合わせて: Stream_Selectと同時に複数のストリームを聴くことができ、待ち時間をさらに短縮できます。