is_readable () unterscheidet nicht, ob die Datei nicht vorhanden ist oder die Berechtigungen nicht ausreichen. Zum Beispiel:
<span><span><span class="hljs-variable">$file</span></span><span> = </span><span><span class="hljs-string">'/path/to/nonexistent.txt'</span></span><span>;
</span><span><span class="hljs-title function_ invoke__">var_dump</span></span><span>(</span><span><span class="hljs-title function_ invoke__">is_readable</span></span><span>(</span><span><span class="hljs-variable">$file</span></span><span>)); </span><span><span class="hljs-comment">// Ausgabe false</span></span><span>
</span></span>
Wenn Sie es nur auf falschen Ergebnissen verarbeiten, denken Sie möglicherweise fälschlicherweise, dass es sich um ein Erlaubnisproblem handelt, und die tatsächliche Datei existiert überhaupt nicht.
Lösung : Verwenden Sie zuerst File_Exists (), um festzustellen, ob die Datei vorliegt, und überprüfen Sie dann die Lesbarkeit.
<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">$file</span></span><span>) && </span><span><span class="hljs-title function_ invoke__">is_readable</span></span><span>(</span><span><span class="hljs-variable">$file</span></span><span>)) {
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"Die Datei existiert und ist lesbar"</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">"Die Datei existiert nicht oder ist unlesbar"</span></span><span>;
}
</span></span>
is_readable () verwendet den Pfad relativ zum aktuellen Arbeitsverzeichnis von PHP. Wenn der Pfad unklar ist, kann das Check -Ergebnis Fehler sein. Zum Beispiel:
<span><span><span class="hljs-variable">$file</span></span><span> = </span><span><span class="hljs-string">'data/file.txt'</span></span><span>;
</span><span><span class="hljs-title function_ invoke__">var_dump</span></span><span>(</span><span><span class="hljs-title function_ invoke__">is_readable</span></span><span>(</span><span><span class="hljs-variable">$file</span></span><span>));
</span></span>
Wenn Ihre PHP -Skripte funktionieren und das erwartete Verzeichnis unterschiedlich sind, kann dies falsch zurückgegeben werden. Dies ist ein Problem, das viele Anfänger zu übersehen können.
Problemumgehung : Verwenden Sie einen absoluten Pfad oder erhalten Sie das aktuelle Skriptverzeichnis über __dir__ :
<span><span><span class="hljs-variable">$file</span></span><span> = </span><span><span class="hljs-keyword">__DIR__</span></span><span> . </span><span><span class="hljs-string">'/data/file.txt'</span></span><span>;
</span></span>
is_readable () überprüft die Lesbarkeit der Zieldatei der symbolischen Link, nicht die Berechtigungen des symbolischen Links selbst. Dies bedeutet, dass das Ergebnis auch dann unlesbar ist, wenn die symbolischen Verknüpfungsberechtigungen Zugriff zulassen, wenn die Zieldatei nicht ausreicht.
<span><span><span class="hljs-comment">// Annahmen link.txt Es bedeutet secret.txt Symbolverbindungen</span></span><span>
</span><span><span class="hljs-title function_ invoke__">var_dump</span></span><span>(</span><span><span class="hljs-title function_ invoke__">is_readable</span></span><span>(</span><span><span class="hljs-string">'link.txt'</span></span><span>)); </span><span><span class="hljs-comment">// je nach secret.txt Berechtigungen</span></span><span>
</span></span>
Hinweis : Bei der Behandlung symbolischer Links ist es am besten, die Berechtigungen der Zieldatei zu klären, um unerwartete Zugriffsfehler zu vermeiden.
Unter Windows -Systemen wird is_readable () hauptsächlich basierend auf Dateiattributen überprüft, während es auf UNIX/Linux -Systemen auf der Grundlage von Benutzerberechtigungen (UID/GID) und Dateiberechtigungsbits beurteilt wird. In einigen Fällen kann der gleiche Code unterschiedliche Ergebnisse auf verschiedenen Plattformen zurückgeben.
is_readable () prüft nur die Dateisystemberechtigungen und prüft nicht, ob die Datei von anderen Prozessen gesperrt ist. Wenn die Datei besetzt ist (z. B. ausschließlich von einem anderen Programm geschrieben), kann IS_READABLE () immer noch true zurückgeben, aber der tatsächliche Lesevorgang kann fehlschlagen.
Bei Systemen, die erweiterte Sicherheitsmechanismen verwenden, können die Dateiberechtigungen durch ACL oder Selinux eingeschränkt werden. IS_READABLE () kann weiterhin true zurückkehren, aber der Versuch, die Datei zu lesen, wird abgelehnt.