IS_LINK関数の関数は、指定されたパスがシンボリックリンクであるかどうかを判断することです。 Trueを返すことは、パスが象徴的なリンクであることを意味し、 Falseを返すことは、それが象徴的なリンクではないか、パスが存在しないことを意味します。その基本的な使用形式は次のとおりです。
<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は、ターゲットがディレクトリであるかファイルであるかを区別できないため、パスがシンボリックリンクであるかどうかのみがわかります。
パス許可:場合によっては、シンボリックリンクによって指摘されているターゲットは、許可の問題によりアクセスできない場合があります。 IS_LINKのみを使用する場合、ターゲットにアクセスできない問題は見つかりません。そのため、リンクされたターゲットのアクセスステータスを確認するには、 IS_ReadableやIS_Writableなどの関数に協力する必要があります。
一般的な問題は、シンボリックリンクがループを形成できることです。たとえば、シンボリックリンクは、それ自体または別のシンボリックリンクを指し、円形構造を形成します。この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 Systemsでは、 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は頻繁に一緒に使用されますが、2つの関数間に動作に違いがあります。 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など)で使用することをお勧めします。