PHP读取点开头文件需先用ls -a验证存在性,再用scandir(__DIR__, SCANDIR_SORT_NONE)配合array_filter过滤'.','..',或glob('.*', GLOB_NOSORT)匹配,判断时须file_exists&&!is_dir&&is_readable。

PHP中读取或操作以点开头的文件名(如 .env、.gitignore)时,系统可能默认将其视为隐藏文件而跳过,导致 opendir()、scandir() 或 glob() 无法正常返回结果,或 file_exists() 判断失败。
确认当前目录是否包含点开头的文件
先用 shell 命令验证真实存在性:执行 ls -a 查看当前目录下所有文件,包括以点开头的隐藏项。如果命令行能列出 .env,但 PHP 脚本却读不到,说明问题出在 PHP 的文件扫描逻辑或权限配置上。
这一步必须做,否则后续所有 PHP 操作都在错误前提下进行。
使用 scandir() 正确读取含点开头的文件
方法一:显式指定排序标志并过滤掉 '.' 和 '..' 目录项
立即学习“PHP免费学习笔记(深入)”;
调用 scandir(__DIR__, SCANDIR_SORT_NONE) → 得到原始数组 → 用 array_filter 过滤掉 '.' 和 '..' → 保留所有以点开头的真实文件名(如 '.htaccess'、'.env')。
注意:SCANDIR_SORT_NONE 是关键,否则默认按字母排序会把 '.' 开头的条目排在最前,干扰你判断哪些是真实文件;而直接用 SCANDIR_SORT_ASC 可能导致某些系统(如 Alpine Linux 上的 musl libc)跳过点开头项。
glob() 匹配点开头文件的写法
方法1:用花括号扩展匹配模式
写成 glob('{.,}*', GLOB_BRACE | GLOB_NOSORT) → 同时匹配以点开头和不以点开头的所有文件。
方法2:单独匹配点开头文件
用 glob('.*', GLOB_NOSORT) → 但必须加上 GLOB_NOSORT,否则默认行为会自动排除 '.' 和 '..',且不保证返回其他点文件(部分 PHP 版本会跳过纯点名文件)。
【GLOB_NOSORT 不可省略】,否则 glob('.*') 在 PHP 7.4+ 中可能只返回空数组。
判断点开头文件是否存在且可读
第一步:拼接完整路径,例如 $path = __DIR__ . '/.env';
第二步:检查文件是否存在且不是目录:file_exists($path) && !is_dir($path);
第三步:验证可读性:is_readable($path);
第四步:若前三步都通过,再用 file_get_contents($path) 读取内容。
不要跳过第二步——有些系统允许创建名为 '.' 的普通文件,它既存在又可读,但 is_dir('.') 返回 true,直接读会触发 warning。



















