glob()返回空数组最常见原因是路径拼接错误,如$directory末尾漏斜杠导致模式无效;其次为大小写敏感、非递归限制、open_basedir拦截。

glob() 返回空数组的最常见原因:路径拼接错误
绝大多数 glob() 找不到文件的情况,不是函数坏了,而是传进去的模式字符串压根没指向真实目录。比如写成 $directory . "*.jpg",而 $directory 末尾漏了斜杠,结果变成 /var/wwwimages/*.jpg(中间缺 /),系统当然找不到。
务必检查拼接后的完整模式:
- 用
echo $pattern;打印出实际传给glob()的字符串,确认它看起来像/full/path/to/*.jpg而不是/full/path/to*.jpg - 统一用
__DIR__ . '/images/*.png',避免依赖getcwd() - Windows 下反斜杠
在双引号字符串里是转义符,要么用单引号,要么写成__DIR__ . '\images\*.jpg'或直接用正斜杠(PHP 支持)
Linux/macOS 下大小写敏感导致 *.JPG 匹配不到 *.jpg
Linux 和 macOS 文件系统默认区分大小写,glob("*.JPG") 完全不会命中 photo.jpg。这不是 PHP 的 bug,是底层文件系统的规则。
解决方法取决于你是否需要严格区分:
- 如果只要找图片,且扩展名可能混用,改用小写通配:
glob(__DIR__ . '/img/*.{jpg,jpeg,png,gif}', GLOB_BRACE) - 如果必须匹配原始大小写,先用
scandir()获取所有文件名,再用preg_grep()过滤,例如:preg_grep('/.(jpg|jpeg)$/i', scandir($dir)) - 别依赖
GLOB_CASELESS—— 它只影响通配符本身的大小写(如*.JPG是否匹配*.jpg),但对实际文件名大小写无影响
glob() 不支持递归,子目录里的文件天然被忽略
glob() 默认只扫描一级目录,glob("*.php") 永远不会返回 lib/utils.php。这点常被误认为“找不到文件”,其实是功能限制。
要扫子目录,有三个实际可用方案:
- 用
RecursiveDirectoryIterator+RegexIterator,控制力最强,适合复杂过滤 - 简单递归:写个封装函数调用
glob($dir . '/*.ext')和glob($dir . '/*/*.ext')多次(最多两三级够用) - 用
find命令(仅限 CLI 环境):shell_exec("find " . escapeshellarg($dir) . " -name '*.log'"),注意权限和安全过滤
open_basedir 或 safe_mode 限制让 glob() 静默失败
当服务器启用了 open_basedir,而你的 glob() 模式超出了允许范围,函数会直接返回空数组,不报错、不警告——这是最隐蔽的坑。
快速验证方式:
- 执行
echo ini_get('open_basedir');,看输出是否为空或包含你目标路径的父目录 - 用
file_exists()测试同一个路径下的某个确定存在的文件,如果也返回false,基本可锁定是open_basedir拦截 - 开发环境可临时在
.htaccess中加php_admin_value open_basedir none(Apache)或修改php.ini,生产环境必须联系运维调整白名单
glob() 的输入模式,再确认该模式下用 shell 手动执行 ls /your/path/*.jpg 是否有结果。两边一致却 PHP 返回空,大概率是 open_basedir 或权限问题;不一致,就回头修路径拼接。php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











