IS_LINK 함수의 기능은 주어진 경로가 상징적 링크인지 여부를 결정하는 것입니다. 진정한 반환은 경로가 상징적 링크임을 의미하며, 거짓을 반환한다는 것은 그것이 상징적 링크가 아니거나 경로가 존재하지 않음을 의미합니다. 기본 사용 형식은 다음과 같습니다.
<span><span><span class="hljs-title function_ invoke__">is_link</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><span class="hljs-keyword">bool</span></span><span>
</span></span>주어진 경로 $ filename이 기호 링크를 가리키면 IS_LINK는 TRUE를 반환 합니다. IS_LINK는 연결된 대상 파일 또는 디렉토리가 존재하는지 여부를 결정하지 않으며 상징적 링크인지 여부 만 감지합니다.
경로가 디렉토리를 가리키면 IS_LINK 및 일반 파일이 동일하게 작동하며 상징적 링크인지 올바르게 결정할 수 있습니다. 문제는 디렉토리의 상징적 링크가 특정 함정을 소개 할 수 있다는 것입니다.
디렉토리와 파일 사이의 혼란 : 디렉토리 링크를 판단하려는 경우 링크 자체가 일반 디렉토리가 아닌 상징적 링크인지 확인하십시오. IS_LINK는 대상이 디렉토리인지 파일인지 여부를 구별 할 수 없으므로 경로가 상징적 링크인지 여부를 알려줍니다.
PATH 권한 : 경우에 따라 상징적 링크가 지적한 목표는 권한 문제로 인해 접근 할 수 없을 수 있습니다. IS_LINK 만 사용하는 경우 대상에 대해 액세스 할 수없는 문제를 찾지 못하므로 링크 된 대상의 액세스 상태를 확인하려면 IS_READABLE 또는 IS_WRIBLE 와 같은 함수와 협력해야합니다.
일반적인 문제는 상징적 링크가 루프를 형성 할 수 있다는 것입니다. 예를 들어, 상징적 링크는 그 자체 또는 다른 상징적 링크를 가리키며, 원형 구조를 형성합니다. 이 IS_Link 함수 자체는이를 감지하지 않으므로 프로그램이 죽은 루프로 떨어지지 않도록 상징적 링크를 처리 할 때 특별한주의를 기울여야합니다.
<span><span><span class="hljs-comment">// 가정 'link1' 상징적 링크입니다,정위 'link2'</span></span><span>
</span><span><span class="hljs-comment">// 'link2' 又상징적 링크입니다,정위 'link1'</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-string">'link1'</span></span><span>)) {
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"link1 상징적 링크입니다\n"</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-string">'link2'</span></span><span>)) {
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"link2 상징적 링크입니다\n"</span></span><span>;
}
</span></span>이 상황으로 인해 프로그램이 특히 기호 링크 해상도를 수행 할 때 프로그램이 지속적으로 주기적으로 감지 될 수 있으며 프로그램이 링크에 대한 반복적 인 액세스를 피해야합니다.
기호 링크 루프의 문제를 피하려면 RealPath를 사용하여 기호 링크의 최종 목표 경로를 얻을 수 있습니다. RealPath는 모든 상징적 링크를 구문 분석하고 최종 절대 경로를 반환합니다. 기호 링크가 자신을 가리키거나 루프를 형성하면 RealPath는 False를 반환합니다.
<span><span><span class="hljs-variable">$realpath</span></span><span> = </span><span><span class="hljs-title function_ invoke__">realpath</span></span><span>(</span><span><span class="hljs-string">'link1'</span></span><span>);
</span><span><span class="hljs-keyword">if</span></span><span> (</span><span><span class="hljs-variable">$realpath</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">"기호 링크 루프 또는 대상 도달 할 수없는 대상\n"</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 class="hljs-subst">$realpath</span></span></span><span>\n";
}
</span></span>파일 시스템에서 상징적 링크 및 디렉토리 링크의 처리는 약간 다릅니다. 예를 들어, Linux 시스템에서 IS_LINK는 기호 링크를 올바르게 식별 할 수 있지만 Windows와 같은 일부 운영 체제에서는 상징적 링크의 동작이 다를 수 있습니다. 프로그램을 다른 플랫폼에서 실행 해야하는 경우 IS_LINK를 사용할 때 운영 체제에 대한 판단을 내려서 교차 플랫폼 호환성을 보장하는 것이 좋습니다.
<span><span><span class="hljs-keyword">if</span></span><span> (PHP_OS === </span><span><span class="hljs-string">'WINNT'</span></span><span>) {
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"존재하다Windows플랫폼에서,상징적 링크의 행동은 관련 될 수 있습니다Linux다른。\n"</span></span><span>;
}
</span></span>IS_LINK 및 IS_DIR은 종종 함께 사용되지만 두 기능 사이에는 동작에 차이가 있습니다. IS_LINK는 경로가 상징적 링크인지 여부 만 확인하는 반면 IS_DIR은 경로가 디렉토리인지 확인합니다. 기호 링크가 디렉토리를 가리키는 지 여부를 결정하려면 IS_LINK 및 IS_DIR을 사용하여 판단을 할 수 있습니다.
<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-keyword">if</span></span><span> (</span><span><span class="hljs-title function_ invoke__">is_dir</span></span><span>(</span><span><span class="hljs-title function_ invoke__">realpath</span></span><span>(</span><span><span class="hljs-variable">$path</span></span><span>))) {
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"符号链接정위一个目录\n"</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">"符号链接정위非目录路径\n"</span></span><span>;
}
}
</span></span>IS_LINK 함수는 기호 링크를 판단 할 때 매우 간단하고 효과적이지만 디렉토리 링크를 다룰 때주의를 기울여야 할 세부 정보가 여전히 있습니다. 특히 원형 링크, 플랫폼 차이, 링크 대상 권한 등과 같은 문제 등 프로그램의 견고성을 보장하기 위해 IS_LINK 를 사용하여 일반적인 함정을 피하고 공모 링크의 정확한 처리를 보장 할 때 다른 기능 (예 : RealPath , IS_DIR , IS_READable 등)과 함께 사용하는 것이 좋습니다.