php에서 file_exists ()는 파일 또는 디렉토리가 존재하는지 여부를 결정하는 데 사용되는 매우 일반적인 기능입니다. 그러나 상징적 링크가 발생하면 예기치 않은 문제가 발생할 수 있습니다. 이러한 잠재적 인 "피트"를 이해하는 것은 개발자에게, 특히 크로스 플랫폼 파일 작업을 처리하거나 다른 환경에 배포 할 때 개발자에게 매우 중요합니다.
UNIX/Linux 시스템에서 상징적 링크는 다른 파일 또는 디렉토리를 가리키는 특수 유형의 파일입니다. "바로 가기"로 간주 될 수 있으며 데이터 컨텐츠 자체가 포함되어 있지 않지만 실제로 존재하는 경로를 가리 킵니다.
php에서 file_exists ()는 실제로 링크 대상이 존재하는지 확인하고 있습니다. 이것은 매우 중요합니다.
<span><span><span class="hljs-title function_ invoke__">symlink</span></span><span>(</span><span><span class="hljs-string">'/path/to/real/file.txt'</span></span><span>, </span><span><span class="hljs-string">'/path/to/link.txt'</span></span><span>);
</span><span><span class="hljs-title function_ invoke__">file_exists</span></span><span>(</span><span><span class="hljs-string">'/path/to/link.txt'</span></span><span>); </span><span><span class="hljs-comment">// 실제 검사는입니다 /path/to/real/file.txt 존재합니까?</span></span><span>
</span></span>
기호 링크 자체가 존재하지만 가리키는 대상 파일이 삭제되었거나 존재하지 않는 경우 file_exists ()는 false를 반환합니다. 이것은 특히 확인하려는 것이 링크가 대상이 아닌지 여부인지 잘못 판단 할 수 있습니다.
<span><span><span class="hljs-comment">// 가정 /tmp/link.txt 상징적 링크입니다,정위 /tmp/missing.txt(삭제)</span></span><span>
</span><span><span class="hljs-keyword">if</span></span><span> (</span><span><span class="hljs-title function_ invoke__">file_exists</span></span><span>(</span><span><span class="hljs-string">'/tmp/link.txt'</span></span><span>)) {
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"존재하다"</span></span><span>;
} </span><span><span class="hljs-keyword">else</span></span><span> {
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"不존재하다"</span></span><span>; </span><span><span class="hljs-comment">// 실제 출력은입니다 “不존재하다”,~ 일지라도 /tmp/link.txt 파일 자체는 여전히 있습니다</span></span><span>
}
</span></span>
file_exists ()는 경로가 상징적 링크인지 여부를 알려주지 않으며 대상 파일이 존재하는지 여부에만 관심이 있습니다. 경로가 상징적 링크인지를 명확하게 알아야하는 경우 IS_LINK ()를 사용해야합니다.
기호 링크 지원은 Windows 및 Linux의 경우 정확히 동일하지 않습니다. Windows에서 기호 링크를 생성하려면 관리자 권한이 필요하며 일부 PHP 환경에는 상징적 링크가 전혀 지원되지 않을 수 있습니다. 따라서 기호 링크 로직에 의존하면 일부 플랫폼에서 프로그램이 일관되지 않게 행동 할 수 있습니다.
기호 링크가 상대 경로를 사용하는 경우 작업 디렉토리가 다르면 File_Exists () 판단 오류로 이어질 수도 있습니다. 예를 들어, CLI는 웹 환경의 작업 디렉토리와 다르기 때문에 링크 대상이 올바르게 해결되는 것을 방지 할 수 있습니다.
경로가 Symlink인지 알고 싶다면 file_exists ()를 사용하지 말고 사용하십시오.
<span><span><span class="hljs-keyword">if</span></span><span> (</span><span><span class="hljs-title function_ invoke__">is_link</span></span><span>(</span><span><span class="hljs-string">'/path/to/symlink'</span></span><span>)) {
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"상징적 링크입니다"</span></span><span>;
}
</span></span>
readlink ()를 사용하여 기호 링크가 가리키는 경로를 가져온 다음 file_exists ()를 결합하여 대상이 존재하는지 여부를 결정할 수 있습니다.
<span><span><span class="hljs-variable">$path</span></span><span> = </span><span><span class="hljs-string">'/path/to/symlink'</span></span><span>;
</span><span><span class="hljs-keyword">if</span></span><span> (</span><span><span class="hljs-title function_ invoke__">is_link</span></span><span>(</span><span><span class="hljs-variable">$path</span></span><span>)) {
</span><span><span class="hljs-variable">$target</span></span><span> = </span><span><span class="hljs-title function_ invoke__">readlink</span></span><span>(</span><span><span class="hljs-variable">$path</span></span><span>);
</span><span><span class="hljs-keyword">if</span></span><span> (</span><span><span class="hljs-title function_ invoke__">file_exists</span></span><span>(</span><span><span class="hljs-variable">$target</span></span><span>)) {
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"链接和目标都존재하다"</span></span><span>;
} </span><span><span class="hljs-keyword">else</span></span><span> {
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"链接존재하다,그러나 목표는 손실됩니다"</span></span><span>;
}
}
</span></span>
RealPath ()는 상징적 링크를 구문 분석하고 실제 경로를 반환하지만 대상이 존재하지 않으면 거짓을 반환합니다. 따라서 사용하기 전에 경로가 존재하는지 확인하십시오.
<span><span><span class="hljs-variable">$real</span></span><span> = </span><span><span class="hljs-title function_ invoke__">realpath</span></span><span>(</span><span><span class="hljs-string">'/path/to/maybe-symlink'</span></span><span>);
</span><span><span class="hljs-keyword">if</span></span><span> (</span><span><span class="hljs-variable">$real</span></span><span> !== </span><span><span class="hljs-literal">false</span></span><span>) {
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"진짜 길은입니다 <span class="hljs-subst">$real</span></span></span><span>";
}
</span></span>
기호 링크는 일부 공유 호스트 또는 특수 운영 체제에서 다르게 행동 할 수 있습니다. file_exists ()를 사용하는 경우 대상 운영 체제의 동작을 명확히하고 환경 감지 또는 예외 처리를 수행해야합니다.
file_exists ()는 특히 상징적 링크를 다룰 때 강력하지만 쉽게 오용 된 기능입니다. 개발자는 그 행동에 대해 명확해야합니다. 그것은 상징적 링크 자체가 존재하는지 여부가 아니라 목표가 존재하는지 판단합니다 . IS_LINK () , readLink () 및 RealPath () 와 같은 함수를 합리적으로 사용하면 파일 검사 로직을보다 정확하게 제어하고 이러한 공통 트랩에 빠지지 않도록 할 수 있습니다.