PHP glob() 返回空数组主因是路径无效、模式错误或权限不足,需依次验证路径存在性、通配符合法性、执行用户权限及 open_basedir 限制,并注意其静默失败特性。

PHP glob() 返回空数组,通常不是函数失效,而是路径、模式或权限等环节出了问题。排查要从最基础的路径有效性开始,逐层验证。
确认路径存在且可访问
glob 不支持相对路径的模糊解析(比如 ../ 或未定义的变量拼接),必须是真实存在的绝对路径或当前工作目录下有效的相对路径。
- 用
is_dir()和file_exists()显式检查目标路径是否存在且为目录 - 用
getcwd()查看当前工作目录,避免误以为脚本在项目根目录运行 - 推荐统一使用
__DIR__ . '/path/to/dir'拼接绝对路径,避免歧义
检查通配符模式是否合法
glob 模式不支持正则语法,只识别 *、?、[...] 等 shell 风格通配符;若路径含特殊字符(如空格、括号、中文),需注意 shell 解析限制。
- 简单测试:先用
glob(__DIR__ . '/*')看是否能列出子项,排除模式错误 - 避免在模式中直接写变量拼接的扩展名,如
"*.{$ext}"—— 若$ext为空或含非法字符会静默失败 - Windows 下注意反斜杠转义问题,建议统一用正斜杠或
str_replace('\', '/', $path)
验证执行用户权限与 open_basedir 限制
Web 服务器(如 Apache/Nginx + PHP-FPM)以特定用户身份运行,可能无权读取目标目录;同时,PHP 配置中的 open_basedir 会硬性限制可访问路径范围。
立即学习“PHP免费学习笔记(深入)”;
- 用
echo shell_exec('ls -la ' . escapeshellarg($dir));(仅开发环境)快速验证系统级可读性 - 检查
phpinfo()中open_basedir值,确保目标路径在其白名单内 - Linux 下用
ps aux | grep php查进程用户,再用ls -ld /target/dir核对权限(尤其关注执行位 x 对目录的意义)
留意 glob 的默认行为与错误静默特性
glob() 找不到匹配项时返回空数组 [],而非 false,也不会抛出警告——这是设计行为,容易被当成“没报错就没错”。
- 不要仅靠
if (glob(...))判断成功,应配合count()或empty()明确检查结果长度 - 开启
error_reporting(E_ALL); ini_set('display_errors', '1');排除其他潜在错误干扰 - 必要时改用
scandir()+ 手动过滤,更可控且便于调试中间状态



















