In PHP ist File_Exists () eine sehr häufige Funktion, mit der festgestellt wird, ob eine Datei oder ein Verzeichnis vorliegt. Wenn es jedoch auf eine symbolische Verbindung stößt, können einige unerwartete Probleme auftreten. Das Verständnis dieser potenziellen "Gruben" ist für Entwickler sehr wichtig, insbesondere wenn es um plattformübergreifende Dateivorgänge geht oder in verschiedenen Umgebungen bereitgestellt wird.
In UNIX/Linux -Systemen ist ein symbolischer Link eine spezielle Art von Datei, die auf eine andere Datei oder ein anderes Verzeichnis verweist. Es kann als "Verknüpfung" angesehen werden und enthält keinen Dateninhalt selbst, sondern weist auf einen Pfad hin, der tatsächlich existiert.
In PHP prüft File_Exists () tatsächlich, ob das Linkziel vorhanden ist. Das ist sehr kritisch.
<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">// Die tatsächliche Inspektion ist /path/to/real/file.txt Existiert es?</span></span><span>
</span></span>
Wenn der symbolische Link selbst vorhanden ist, aber die Zieldatei, auf die er verweist, wurde gelöscht oder nicht existiert, gibt File_Exists () false zurück. Dies kann zu Fehleinschätzungen führen, insbesondere wenn Sie überprüfen möchten, ob der Link existiert, nicht das Ziel.
<span><span><span class="hljs-comment">// Annahmen /tmp/link.txt ist eine symbolische Verbindung,Orientierung /tmp/missing.txt(Gelöscht)</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">"existieren"</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">"不existieren"</span></span><span>; </span><span><span class="hljs-comment">// Der tatsächliche Ausgang ist “不existieren”,wenngleich /tmp/link.txt Die Datei selbst ist noch da</span></span><span>
}
</span></span>
Datei_Exists () wird Ihnen nicht mitteilen, ob ein Pfad ein symbolischer Link ist. Es ist nur wichtig, ob die Zieldatei vorhanden ist. Wenn Sie klar wissen müssen, ob der Pfad ein symbolischer Link ist, sollten Sie is_link () verwenden.
Die Unterstützung der Symbolverbindung ist für Windows und Linux nicht genau gleich. Das Erstellen von symbolischen Links erfordert unter Windows Administratorrechte, und einige PHP -Umgebungen unterstützen möglicherweise überhaupt keine symbolischen Verbindungen. Wenn Sie sich auf eine symbolische Logik verlassen, können Programme auf einigen Plattformen inkonsistent verhalten.
Wenn symbolische Links relative Pfade verwenden, kann es auch zu den Urteilsfehlern von File_Exists () führen, wenn das Arbeitsverzeichnis unterschiedlich ist. Zum Beispiel unterscheidet sich CLI von Arbeitsverzeichnissen in einer Webumgebung, wodurch das Link -Ziel nicht korrekt behoben wird.
Wenn Sie wissen möchten, ob ein Pfad ein Symlink ist, verwenden Sie nicht File_Exists () , sondern verwenden Sie:
<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">"ist eine symbolische Verbindung"</span></span><span>;
}
</span></span>
Sie können Readlink () verwenden, um den Pfad durch den symbolischen Link zu vermitteln und dann Datei_exists () zu kombinieren, um festzustellen, ob das Ziel existiert.
<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">"链接和目标都existieren"</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">"链接existieren,Aber das Ziel ist verloren"</span></span><span>;
}
}
</span></span>
RealPath () analysiert den symbolischen Link und gibt den realen Weg zurück, aber wenn das Ziel nicht existiert, gibt es falsche zurück. Stellen Sie daher sicher, dass der Weg vor der Verwendung existiert.
<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">"Der wahre Weg ist <span class="hljs-subst">$real</span></span></span><span>";
}
</span></span>
Symbolverbindungen können sich bei einigen gemeinsamen Hosts oder speziellen Betriebssystemen unterschiedlich verhalten. Bei Verwendung von File_Exists () müssen Sie das Verhalten des Zielbetriebssystems klären und Umgebungserkennung oder Ausnahmebehandlung durchführen.
Datei_Exists () ist eine leistungsstarke, aber auch leicht missbrauchte Funktion, insbesondere wenn es sich um symbolische Links handelt. Der Entwickler sollte sich in Bezug auf sein Verhalten klar machen: Es beurteilt, ob das Ziel existiert, nicht ob die symbolische Verbindung selbst existiert . Durch die rationalere Verwendung von Funktionen wie is_link () , Readlink () und RealPath () können Sie die Logik der Dateiinspektion genauer steuern und vermeiden, in diese gängigen Fallen zu fallen.