Dans PHP, File_exists () est une fonction très courante utilisée pour déterminer si un fichier ou un répertoire existe. Cependant, lorsqu'il rencontre un lien symbolique, certains problèmes inattendus peuvent survenir. La compréhension de ces «fosses» potentielles est très importante pour les développeurs, en particulier lorsqu'ils traitent des opérations de fichiers multiplateformes ou le déploiement dans différents environnements.
Dans les systèmes UNIX / Linux, un lien symbolique est un type spécial de fichier qui pointe vers un autre fichier ou répertoire. Il peut être considéré comme un "raccourci" et ne contient pas de contenu de données lui-même, mais indique un chemin qui existe réellement.
Dans PHP, File_exists () vérifie réellement si la cible de liaison existe. C'est très critique.
<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">// L'inspection réelle est /path/to/real/file.txt Est-ce qu'il existe</span></span><span>
</span></span>
Si le lien symbolique lui-même existe, mais que le fichier cible, il pointe a été supprimé ou n'existe pas, file_exists () renvoie false . Cela peut conduire à une erreur de jugement, surtout si ce que vous voulez vérifier est de savoir si le lien existe, pas la cible.
<span><span><span class="hljs-comment">// Hypothèses /tmp/link.txt est un lien symbolique,Orientation /tmp/missing.txt(Supprimé)</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">"exister"</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">"不exister"</span></span><span>; </span><span><span class="hljs-comment">// La sortie réelle est “不exister”,même si /tmp/link.txt Le fichier lui-même est toujours là</span></span><span>
}
</span></span>
File_exists () ne vous dira pas si un chemin est un lien symbolique, il ne se soucie que si le fichier cible existe. Si vous avez besoin de savoir clairement si le chemin est un lien symbolique, vous devez utiliser is_link () .
La prise en charge des liens de symbole n'est pas exactement la même pour Windows et Linux. Sous Windows, la création de liens symboliques nécessite des droits de l'administrateur, et certains environnements PHP peuvent ne pas prendre en charge les liens symboliques. Par conséquent, s'appuyer sur la logique des liens symboliques peut faire en sorte que les programmes se comportent de manière incohérente sur certaines plateformes.
Lorsque les liens symboliques utilisent des chemins relatifs, si le répertoire de travail est différent, il peut également conduire à des erreurs de jugement file_exists () . Par exemple, la CLI est différente des répertoires de travail dans un environnement Web, ce qui peut empêcher la résolution de la cible de liaison.
Si vous voulez savoir si un chemin est un lien symbolique, n'utilisez pas de fichier_exists () , mais utilisez:
<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">"est un lien symbolique"</span></span><span>;
}
</span></span>
Vous pouvez utiliser readLink () pour obtenir le chemin indiqué par le lien symbolique, puis combiner file_exists () pour déterminer si la cible existe.
<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">"链接和目标都exister"</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">"链接exister,Mais la cible est perdue"</span></span><span>;
}
}
</span></span>
realPath () analyse le lien symbolique et renvoie le chemin réel, mais si la cible n'existe pas, il renvoie faux . Par conséquent, assurez-vous que le chemin existe avant l'utilisation.
<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">"Le vrai chemin est <span class="hljs-subst">$real</span></span></span><span>";
}
</span></span>
Les liens de symbole peuvent se comporter différemment sur certains hôtes partagés ou systèmes d'exploitation spéciaux. Lorsque vous utilisez File_Exists () , vous devez clarifier le comportement du système d'exploitation cible et effectuer une détection d'environnement ou une gestion des exceptions.
File_Exists () est une fonction puissante mais aussi facilement mal utilisée, en particulier lorsqu'il s'agit de liens symboliques. Le développeur doit être clair sur son comportement: il juge si la cible existe, et non si le lien symbolique lui-même existe . En utilisant rationnellement des fonctions telles que is_link () , readLink () et realPath () , vous pouvez contrôler plus précisément la logique d'inspection des fichiers et éviter de tomber dans ces pièges communs.