is_readable()不會區分文件不存在還是權限不足。比如:
<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">// 輸出 false</span></span><span>
</span></span>在這種情況下,如果你只是根據false結果進行處理,可能會誤以為是權限問題,而實際文件根本不存在。
解決方法:先使用file_exists()判斷文件是否存在,再檢查可讀性。
<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">"文件存在且可讀"</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></span><span>;
}
</span></span>is_readable()使用的是相對於PHP 當前工作目錄的路徑,如果路徑不明確,可能檢查結果會出錯。例如:
<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>如果你的PHP 腳本工作目錄和預期目錄不同,可能返回false 。這是很多初學者容易忽略的問題。
解決方法:使用絕對路徑,或者通過__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()會檢查符號鏈接目標文件的可讀性,而不是符號鏈接本身的權限。這意味著即使符號鏈接權限允許訪問,如果目標文件權限不足,結果仍然為不可讀。
<span><span><span class="hljs-comment">// 假設 link.txt 是指向 secret.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-string">'link.txt'</span></span><span>)); </span><span><span class="hljs-comment">// 取決於 secret.txt 的權限</span></span><span>
</span></span>注意:在處理符號鏈接時,最好明確目標文件權限,以避免意外訪問失敗。
在Windows 系統上, is_readable()主要根據文件屬性檢查,而在Unix/Linux 系統上,它會結合用戶權限(UID/GID)和文件權限位進行判斷。某些情況下,相同的代碼在不同平台可能返回不同結果。
is_readable()只檢查文件系統權限,並不會考慮文件是否被其他進程鎖定。如果文件被佔用(例如被另一個程序獨占寫入), is_readable()仍可能返回true ,但實際讀取操作可能失敗。
在使用高級安全機制的系統上,文件權限可能被ACL 或SELinux 限制, is_readable()依然可能返回true ,但嘗試讀取文件會被拒絕。