PHPでは、 Stream_Get_Meta_Data()は、ストリームに関連するさまざまなメタ情報を取得するために使用される非常に便利な関数です。多くの開発者は、この関数を使用するときに興味があります:
この記事では、この問題を分析し、例を使用して、 stream_get_meta_data()の実際の機能と制限を示します。
短い答えは次のとおりです。プロトコルタイプを直接識別できません。
Stream_get_meta_data()は、ファイルの終了に到達するかどうか、ブロック(ブロックされた) 、読み取り可能/書き込みなど、多くの有用な情報を返しますが、ストリームのプロトコルタイプを直接返しません。プロトコルタイプの情報は、ストリームを作成するときに実際にストリームリソースに暗黙的ですが、関数を介して露出していません。
例えば:
<span><span><span class="hljs-variable">$fp</span></span><span> = </span><span><span class="hljs-title function_ invoke__">fopen</span></span><span>(</span><span><span class="hljs-string">"http://example.com"</span></span><span>, </span><span><span class="hljs-string">"r"</span></span><span>);
</span><span><span class="hljs-variable">$meta</span></span><span> = </span><span><span class="hljs-title function_ invoke__">stream_get_meta_data</span></span><span>(</span><span><span class="hljs-variable">$fp</span></span><span>);
</span><span><span class="hljs-title function_ invoke__">print_r</span></span><span>(</span><span><span class="hljs-variable">$meta</span></span><span>);
</span><span><span class="hljs-title function_ invoke__">fclose</span></span><span>(</span><span><span class="hljs-variable">$fp</span></span><span>);
</span></span>
返された$メタデータ構造は、ほぼ次のとおりです。
<span><span><span class="hljs-title function_ invoke__">Array</span></span><span>
(
[wrapper_type] => http
[stream_type] => tcp_socket
[mode] => r
[unread_bytes] => </span><span><span class="hljs-number">0</span></span><span>
[seekable] =>
[uri] => </span><span><span class="hljs-attr">http</span></span><span>://example.com
[timed_out] =>
[blocked] => </span><span><span class="hljs-number">1</span></span><span>
[eof] =>
)
</span></span>
その中で、 wrapper_typeは、 HTTP 、 FTP 、 PHPなどの「プロトコルタイプ」に最も近いフィールドです。これは、プロトコル認識に特別に使用されるフィールドではありませんが、ストリームが使用するプロトコルを間接的に判断できます。
wrapper_type :このフィールドは、PHPで使用される「ラッパー」であり、プロトコルに関連するストリームのラッパータイプを表します。一般的な値には、 HTTP 、 FTP 、 PHP 、 PlainFileなどが含まれます。
Stream_Type : TCP_Socket 、 SSL 、 STDIOなどの低レベルの表現は、実際の伝送方法を反映しています。
「プロトコル」レベルで情報を特定する場合は、最初にwrapper_typeフィールドを表示することをお勧めします。
プロトコル情報を抽出して返すヘルパー関数をカプセル化できます。例えば:
<span><span><span class="hljs-function"><span class="hljs-keyword">function</span></span></span><span> </span><span><span class="hljs-title">getStreamProtocol</span></span><span>(</span><span><span class="hljs-params"><span class="hljs-variable">$stream</span></span></span><span>) {
</span><span><span class="hljs-variable">$meta</span></span><span> = </span><span><span class="hljs-title function_ invoke__">stream_get_meta_data</span></span><span>(</span><span><span class="hljs-variable">$stream</span></span><span>);
</span><span><span class="hljs-keyword">return</span></span><span> </span><span><span class="hljs-variable">$meta</span></span><span>[</span><span><span class="hljs-string">'wrapper_type'</span></span><span>] ?? </span><span><span class="hljs-literal">null</span></span><span>;
}
</span></span>
使用例:
<span><span><span class="hljs-variable">$stream</span></span><span> = </span><span><span class="hljs-title function_ invoke__">fopen</span></span><span>(</span><span><span class="hljs-string">'php://input'</span></span><span>, </span><span><span class="hljs-string">'r'</span></span><span>);
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-title function_ invoke__">getStreamProtocol</span></span><span>(</span><span><span class="hljs-variable">$stream</span></span><span>); </span><span><span class="hljs-comment">// 出力: php</span></span><span>
</span><span><span class="hljs-title function_ invoke__">fclose</span></span><span>(</span><span><span class="hljs-variable">$stream</span></span><span>);
</span></span>
このようにして、基本的にフロープロトコルのソースを判断できます。
Stream_get_meta_data()はプロトコル名を明示的に返すことはありませんが、それが返すwrapper_typeフィールドは、開発者が使用されるプロトコルまたはラッパータイプを決定するのに十分です。この間接識別方法は、実際の開発で非常に実用的になりました。
ヒント:複数の種類のストリームリソースを扱うときは、特にネットワークまたはリモートのストリームに関しては、互換性と例外処理に注意してください。