In PHP ist stream_get_meta_data () eine sehr nützliche Funktion, mit der verschiedene Meta -Informationen in Bezug auf Streams erhalten werden. Viele Entwickler sind neugierig, wenn sie diese Funktion verwenden:
In diesem Artikel wird dieses Problem analysiert und Beispiele verwendet, um die tatsächlichen Funktionen und Einschränkungen von stream_get_meta_data () zu veranschaulichen.
Die kurze Antwort lautet: Der Protokolltyp kann nicht direkt identifiziert werden .
Obwohl Stream_Get_Meta_Data () viele nützliche Informationen zurückgibt , z . Die Informationen des Protokolltyps sind beim Erstellen des Streams tatsächlich in der Stream -Ressource impliziert, werden jedoch nicht durch die Funktion freigelegt.
Zum Beispiel:
<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>
Die zurückgegebene $ meta -Datenstruktur ist ungefähr wie folgt:
<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>
Unter ihnen ist Wraper_Type das Feld, das dem "Protokolltyp" am nächsten ist, wie HTTP , FTP , PHP usw., obwohl dies kein Feld ist, das speziell für die Protokollerkennung verwendet wird, können wir indirekt beurteilen, welches Protokoll der Strom verwendet.
WRAPPER_TYPE : Dieses Feld repräsentiert den Wrapper -Typ des Streams, der von PHP verwendet "Wrapper" und häufig mit dem Protokoll zusammenhängen. Zu den gemeinsamen Werten gehören HTTP , FTP , PHP , PlainFile usw.
Stream_type : Darstellungen unter niedrigerer Ebene wie TCP_Socket , SSL , STDIO usw. spiegeln die tatsächliche Übertragungsmethode wider.
Wenn Sie Informationen auf der Ebene "Protokoll" identifizieren möchten, wird empfohlen, zuerst das Feld Wrapper_Type anzuzeigen.
Sie können eine Helferfunktion zusammenschließen, die Protokollinformationen extrahiert und zurückgibt. Zum Beispiel:
<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>
Beispiel der Nutzung:
<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">// Ausgabe: 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>
Auf diese Weise können Sie im Grunde die Quelle des Flussprotokolls beurteilen.
Obwohl Stream_get_meta_data () den Protokollnamen nicht explizit zurückgibt, reicht das von ihm zurückgegebene Wraper_Type -Feld aus, um Entwicklern den verwendeten Protokoll- oder Wrapper -Typ zu ermitteln. Diese indirekte Identifikationsmethode ist in der tatsächlichen Entwicklung sehr praktisch geworden.
Tipps : Wenn Sie sich mit mehreren Arten von Stream -Ressourcen befassen, achten Sie auf die Kompatibilität und die Ausnahmebehandlung, insbesondere wenn es um Netzwerk- oder Remote -Streams geht.