stream_is_local ()은 지정된 스트림이 로컬 파일 시스템의 파일을 가리키는 지 여부를 결정하는 PHP 내장 기능입니다. 함수 서명은 다음과 같습니다.
<span><span><span class="hljs-keyword">bool</span></span><span> </span><span><span class="hljs-title function_ invoke__">stream_is_local</span></span><span>(</span><span><span class="hljs-keyword">string</span></span><span> </span><span><span class="hljs-variable">$filename</span></span><span>)
</span></span>매개 변수 : $ filename 은 확인할 파일 이름이며 파일 경로 또는 URL 일 수 있습니다.
반환 값 : 주어진 스트림이 로컬 파일 인 경우 true를 반환합니다. 그렇지 않으면 거짓 .
이 기능은 종종 로컬 파일을 원격 파일 (예 : FTP 또는 HTTP를 통해 액세스하는 파일)과 구별하는 데 사용됩니다. 파일 작업을 수행하기 전에 로컬 파일이 작동하는지 확인하십시오.
Stream_is_local () 은 매우 간단한 기능이지만 실제 개발에서는 다른 경로 형식이 예상치 못한 결과로 이어질 수 있습니다. 다음은 개발자가 사용할 때 특별한주의를 기울여야하는 몇 가지 일반적인 함정입니다.
stream_is_local () 이 호출되면 경로는 로컬 파일 시스템 경로 또는 URL 일 수 있습니다. 프로토콜 접두사가있는 경로 (예 : http : // 또는 ftp : // )가있는 경우 Stream_is_local () 이 경로가 로컬 파일 시스템을 가리키는 지 여부를 결정하지만 원격 URL 인 경우 False를 반환합니다.
포인트 : stream_is_local ()은 경로 형식에 따라 로컬 파일인지 여부 만 결정하고 프로토콜 부분을 무시한다고 잘못 생각할 수 있습니다.
해결 방법 : 들어오는 경로가 원격 URL이 아닌 올바른 로컬 파일 경로인지 확인하십시오. URL을 통과하는 경우 URL을 처리하고 필요에 따라 적절한 판단을 내야합니다.
<span><span><span class="hljs-variable">$filename</span></span><span> = </span><span><span class="hljs-string">"http://example.com/file.txt"</span></span><span>;
</span><span><span class="hljs-keyword">if</span></span><span> (</span><span><span class="hljs-title function_ invoke__">stream_is_local</span></span><span>(</span><span><span class="hljs-variable">$filename</span></span><span>)) {
</span><span><span class="hljs-comment">// 여기로 돌아갑니다false</span></span><span>
}
</span></span>php의 stream_is_local () 함수는 true 만 반환되므로 경로가 로컬 파일 시스템을 가리키면 판단 오류가 발생할 수 있지만 경로 형식이 파일을 포함하는 프로토콜과 같은 기대치를 충족하지 않으면 파일 : // ).
구덩이 지점 : 파일 : // 프로토콜이 파일 경로에 지정되지 않은 경우 함수가 잘못된 결과를 반환 할 수 있습니다.
해결 방법 : 로컬 파일 경로를 처리 할 때는 항상 파일을 지정하는 것이 가장 좋습니다. // 프로토콜이 로컬 파일을 올바르게 인식 할 수 있도록 프로토콜을 명시 적으로 명시 적으로 지정하는 것이 가장 좋습니다.
<span><span><span class="hljs-variable">$localPath</span></span><span> = </span><span><span class="hljs-string">"/var/www/html/test.txt"</span></span><span>; </span><span><span class="hljs-comment">// 돌아올 수 있습니다false</span></span><span>
</span><span><span class="hljs-variable">$localPathWithProtocol</span></span><span> = </span><span><span class="hljs-string">"file://<span class="hljs-subst">$localPath</span></span></span><span>"; </span><span><span class="hljs-comment">// 더 분명합니다</span></span><span>
</span><span><span class="hljs-keyword">if</span></span><span> (</span><span><span class="hljs-title function_ invoke__">stream_is_local</span></span><span>(</span><span><span class="hljs-variable">$localPathWithProtocol</span></span><span>)) {
</span><span><span class="hljs-comment">// 여기로 돌아갑니다true</span></span><span>
}
</span></span>파일 경로의 형식과 구분기는 운영 체제에 따라 다릅니다. 특히 Windows와 Unix-Like (Linux, MacOS) 시스템 사이에서 경로는 다르게 처리됩니다. Windows는 Backslashes ( \ )를 경로 분리기로 사용하고 Unix와 같은 시스템은 앞으로 ( / )를 사용합니다. stream_is_local () 함수는 운영 체제의 경로 형식을 기반으로 판단하지만 경로 형식이 올바른지 확인해야합니다.
PIT POINT : Windows Systems에서 경로에는 백 슬래시가있을 수있어 Stream_is_local () 이 로컬 파일을 올바르게 인식하지 못하게 할 수 있습니다.
해결 방법 : 경로의 구분 기호가 현재 운영 체제와 호환되는지 확인하거나 Directory_Separator Constant를 사용하여 Windows 시스템에 자동으로 적응하십시오.
<span><span><span class="hljs-variable">$path</span></span><span> = </span><span><span class="hljs-string">"C:\\Users\\test\\file.txt"</span></span><span>; </span><span><span class="hljs-comment">// Windows백 슬래시 경로</span></span><span>
</span><span><span class="hljs-variable">$pathLinux</span></span><span> = </span><span><span class="hljs-string">"/home/user/file.txt"</span></span><span>; </span><span><span class="hljs-comment">// 친절한Unix전진 슬래시 경로</span></span><span>
</span></span>stream_is_local () 함수는 상대 및 절대 경로를 처리하는 방법이 다릅니다. 상대 경로를 통과하는 경우 PHP는 현재 작업 디렉토리와 결합하여 실제 경로를 생성합니다. 이는 특히 다른 실행 환경에서 판단 오류로 이어질 수 있습니다.
구덩이 지점 : 상대 경로를 사용할 때 Stream_is_local ()은 로컬 파일을 올바르게 판단하지 못할 수 있습니다. 잘못된 현재 작업 디렉토리를 기반으로 경로를 해결할 수 있습니다.
해결책 : 가능한 경우 항상 판단을 위해 절대 경로를 사용하십시오. realPath () 함수를 통해 상대 경로를 절대 경로로 변환 할 수 있습니다.
<span><span><span class="hljs-variable">$relativePath</span></span><span> = </span><span><span class="hljs-string">"./file.txt"</span></span><span>;
</span><span><span class="hljs-variable">$absolutePath</span></span><span> = </span><span><span class="hljs-title function_ invoke__">realpath</span></span><span>(</span><span><span class="hljs-variable">$relativePath</span></span><span>); </span><span><span class="hljs-comment">// 절대 경로를 얻으십시오</span></span><span>
</span><span><span class="hljs-keyword">if</span></span><span> (</span><span><span class="hljs-title function_ invoke__">stream_is_local</span></span><span>(</span><span><span class="hljs-variable">$absolutePath</span></span><span>)) {
</span><span><span class="hljs-comment">// 로컬 파일을 올바르게 판단하십시오</span></span><span>
}
</span></span>stream_is_local ()은 흐름 경로가 디렉토리가 아닌 로컬 파일을 가리키는 지 여부를 결정합니다. 파일 경로 대신 디렉토리 경로를 전달하면 함수가 False를 반환합니다. 이로 인해 디렉토리가 로컬 파일 시스템에 있는지 확인하려는 시나리오에 대한 혼란이 발생할 수 있습니다.
PIT POINT : 경로가 파일이 아닌 디렉토리를 가리키면 stream_is_local ()은 false를 반환합니다.
해결 방법 : stream_is_local ()을 사용하는 경우 들어오는 경로가 디렉토리가 아닌 파일을 가리 키십시오. 디렉토리를 판단 해야하는 경우 is_dir () 와 같은 다른 기능을 사용할 수 있습니다.
<span><span><span class="hljs-variable">$dirPath</span></span><span> = </span><span><span class="hljs-string">"/var/www/html"</span></span><span>;
</span><span><span class="hljs-keyword">if</span></span><span> (</span><span><span class="hljs-title function_ invoke__">stream_is_local</span></span><span>(</span><span><span class="hljs-variable">$dirPath</span></span><span>)) {
</span><span><span class="hljs-comment">// 여기로 돌아갑니다false,디렉토리이기 때문입니다</span></span><span>
}
</span></span>