Position actuelle: Accueil> Derniers articles> Stream_get_meta_data peut-il identifier le type de protocole du flux? Analyse de la méthode d'utilisation

Stream_get_meta_data peut-il identifier le type de protocole du flux? Analyse de la méthode d'utilisation

gitbox 2025-07-17

Dans PHP, Stream_get_Meta_Data () est une fonction très utile qui est utilisée pour obtenir diverses méta-informations liées aux flux. De nombreux développeurs sont curieux lorsqu'ils utilisent cette fonction:

Cet article analysera ce problème et utilisera des exemples pour illustrer les fonctions et limitations réelles de Stream_get_Meta_Data () .

Stream_get_meta_data () peut-il identifier les types de protocoles?

La réponse courte est: le type de protocole ne peut pas être directement identifié .

Bien que Stream_get_Meta_Data () renvoie de nombreuses informations utiles, par exemple s'ils atteignent la fin du fichier ( EOF ), s'il bloque ( bloqué ), qu'il soit lisible / écrivatif, etc., il ne renvoie pas directement le type de protocole du flux . Les informations du type de protocole sont en fait implicites dans la ressource de flux lors de la création du flux, mais ne sont pas exposées via la fonction.

Par exemple:

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

La structure Meta Data retournée est à peu près la suivante:

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

Parmi eux, le wrapper_type est le champ le plus proche du "type de protocole", tel que HTTP , FTP , PHP , etc. Bien qu'il ne s'agisse pas d'un champ spécifiquement utilisé pour la reconnaissance du protocole, nous pouvons indirectement juger quel protocole utilise le flux.

La signification de wrapper_type et stream_type

  • wrapper_type : Ce champ représente le type de wrapper du flux, qui est le "wrapper" utilisé par PHP, et est souvent lié au protocole. Les valeurs communes incluent HTTP , FTP , PHP , PlainFile , etc.

  • Stream_Type : les représentations de niveau inférieur, telles que TCP_Socket , SSL , STdio , etc., reflètent la méthode de transmission réelle.

Si vous souhaitez identifier les informations au niveau "Protocole", il est recommandé de visualiser d'abord le champ wrapper_type .

Comment juger le protocole via wrapper_type?

Vous pouvez encapsuler une fonction d'assistance qui extrait et renvoie les informations du protocole. Par exemple:

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

Exemple d'utilisation:

 <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">// Sortir: 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>

De cette façon, vous pouvez essentiellement juger la source du protocole de flux.

Résumer

Bien que Stream_get_meta_data () ne renvoie pas explicitement le nom du protocole, le champ wrapper_type qu'il renvoie est suffisant pour aider les développeurs à déterminer le protocole ou le type de wrapper utilisé. Cette méthode d'identification indirecte est devenue très pratique dans le développement réel.

CONSEILS : Lorsque vous traitez plusieurs types de ressources de flux, assurez-vous de faire attention à la compatibilité et à la gestion des exceptions, en particulier en ce qui concerne les flux de réseau ou de télécommande.