php에서 stream_get_meta_data ()는 스트림과 관련된 다양한 메타 정보를 얻는 데 사용되는 매우 유용한 기능입니다. 이 기능을 사용할 때 많은 개발자가 궁금합니다.
이 기사는이 문제를 분석하고 예제를 사용하여 Stream_get_meta_data () 의 실제 함수와 한계를 설명합니다.
짧은 대답은 : 프로토콜 유형을 직접 식별 할 수 없습니다 .
stream_get_meta_data ()는 파일의 끝 ( EOF )에 도달하는지 여부, 블록 ( 차단 가능 ), 읽을 수있는/쓰기 가능 여부 등과 같은 유용한 정보를 많이 반환하지만 스트림의 프로토콜 유형을 직접 반환하지는 않습니다 . 프로토콜 유형의 정보는 실제로 스트림을 생성 할 때 스트림 리소스에 암시되지만 함수를 통해 노출되지 않습니다.
예를 들어:
<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 필드는 개발자가 사용 된 프로토콜 또는 래퍼 유형을 결정하는 데 충분합니다. 이 간접 식별 방법은 실제 발전에서 매우 실용화되었습니다.
팁 : 여러 유형의 스트림 리소스를 처리 할 때 특히 네트워크 나 원격 스트림과 관련하여 호환성 및 예외 처리에주의를 기울여야합니다.