PHPでは、Streamは、ファイル、ネットワーク、メモリなどのさまざまなデータソースとターゲットを均一に処理するために使用される非常に強力な抽象概念です。ストリームを操作するとき、それらのフィルターとメタデータを理解することが非常に重要です。この記事では、Stream_get_filters()とstream_get_meta_data()を組み合わせて使用する方法を紹介して、ストリームに関する詳細情報を取得します。
Stream_Get_Filters()は、現在利用可能なすべてのストリームフィルターをリストするPHPビルトイン関数です。ストリームフィルターを使用して、圧縮、暗号化、エンコード、変換などのストリームのデータを変更できます。
<?php
$filters = stream_get_filters();
print_r($filters);
?>
このコードを実行すると、このような出力が表示される場合があります。
Array
(
[0] => string.rot13
[1] => string.toupper
[2] => zlib.inflate
[3] => zlib.deflate
...
)
これにより、現在のPHP構成でサポートされているフィルターがわかります。
stream_get_meta_data()は、オープンストリームのメタ情報を取得するために使用されます。次のようなさまざまな詳細を含む連想配列を返します。
ストリームは読みやすいですか、それとも書き込み可能ですか?
ファイルの終了(EOF)に到達するかどうか
カプセル化プロトコル( HTTP 、ファイルなど)
ブロックされているかどうか
タイムアウト設定
例:
<?php
$fp = fopen('http://gitbox.net/', 'r');
$meta = stream_get_meta_data($fp);
print_r($meta);
fclose($fp);
?>
出力は似ています:
Array
(
[wrapper_type] => http
[stream_type] => tcp_socket/ssl
[mode] => r
[unread_bytes] => 0
[seekable] =>
[timed_out] =>
[blocked] => 1
[eof] =>
)
2つを組み合わせて、まずサポートされたフィルターを取得し、次にストリームを開き、メタ情報を表示し、フィルターを取り付けてみてください。
サンプルコード:
<?php
// 現在利用可能なフィルターをリストします
$filters = stream_get_filters();
echo "利用可能なフィルターのリスト:\n";
foreach ($filters as $filter) {
echo "- $filter\n";
}
// Aを開きます HTTP 流れ
$url = 'http://gitbox.net/';
$fp = fopen($url, 'r');
if (!$fp) {
die("開くことができません $url\n");
}
// 查看流れ的元数据
$meta = stream_get_meta_data($fp);
echo "\n流れ的元信息:\n";
print_r($meta);
// フィルターを取り付けてみてください(サポートされている場合 zlib.inflate)
if (in_array('zlib.inflate', $filters)) {
stream_filter_append($fp, 'zlib.inflate', STREAM_FILTER_READ);
echo "添付 zlib.inflate フィルターしてストリーミングしますれ。\n";
} else {
echo "zlib.inflate フィルターは使用できません。\n";
}
fclose($fp);
?>
すべてのストリームがすべてのフィルターをサポートするわけではありません。たとえば、 HTTPストリームはZlib.Inflateをサポートせず、コンテキストに基づいて判断する必要があります。
stream_filter_append()を使用する前に、 stream_get_filters()を使用してフィルターが存在するかどうかを確認することをお勧めします。
stream_get_meta_data()は、通話ごとに現在の状態のみを返し、ストリーム状態は読み取りまたは書き込みによって変更される場合があります。