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,但尝试读取文件会被拒绝。