Aktueller Standort: Startseite> Neueste Artikel> Kann Stream_get_meta_data den Protokollyp des Streams identifizieren? Analyse der Nutzungsmethode

Kann Stream_get_meta_data den Protokollyp des Streams identifizieren? Analyse der Nutzungsmethode

gitbox 2025-07-17

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.

Kann Stream_get_meta_data () Protokolltypen identifizieren?

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] =&gt; http
    [stream_type] =&gt; tcp_socket
    [mode] =&gt; r
    [unread_bytes] =&gt; </span><span><span class="hljs-number">0</span></span><span>
    [seekable] =&gt; 
    [uri] =&gt; </span><span><span class="hljs-attr">http</span></span><span>://example.com
    [timed_out] =&gt; 
    [blocked] =&gt; </span><span><span class="hljs-number">1</span></span><span>
    [eof] =&gt; 
)
</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.

Die Bedeutung von Wrapper_Type und Stream_type

  • 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.

Wie beurteile ich das Protokoll über Wraper_Type?

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.

Zusammenfassen

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.