glob()适合单目录通配符匹配,仅支持*、?、[];RecursiveDirectoryIterator用于递归遍历;超大目录或复杂条件优先用find命令,但需路径净化与跨平台适配。

用 glob() 快速匹配同目录下的文件
glob() 是 PHP 原生最轻量的批量文件搜索方式,适合在单个目录内按通配符查找。它不递归,但速度快、无依赖、兼容 PHP 4.3+。
常见错误是误以为 glob() 支持正则——它只认 shell 风格通配符:*、?、[abc]。
- 查当前目录所有
.log文件:glob("*.log") - 查
logs/下 2024 年的 JSON:glob("logs/2024-*.json") - 忽略大小写?不行——
glob()区分大小写,Linux 下尤其要注意.jpg和.JPG - 返回空数组不等于出错,可能是没匹配到,也可能是权限不足(需检查
opendir()权限)
用 RecursiveDirectoryIterator 递归遍历子目录
需要搜整个目录树时,RecursiveDirectoryIterator + RecursiveIteratorIterator 是标准解法。比自己写递归更健壮,自动跳过符号链接(除非显式启用)。
容易踩的坑:默认会把 . 和 .. 当作目录项返回,且包含目录本身;实际使用前必须过滤。
立即学习“PHP免费学习笔记(深入)”;
- 只取文件(排除目录):
if ($item->isFile()) - 按扩展名筛选:
pathinfo($item->getFilename(), PATHINFO_EXTENSION) === 'txt' - 路径拼接别用字符串拼:
$item->getPathname()直接返回完整路径,避免 Windows/Linux 斜杠问题 - 大量小文件时性能尚可;但若目录极深或含数万项,建议加
break或分页处理,避免内存溢出
用 find 命令(仅 Linux/macOS)绕过 PHP 性能瓶颈
当目标目录极大(如 /var/log)、或需复杂条件(修改时间、文件大小、权限位)时,PHP 原生迭代器会变慢。此时调用系统 find 更高效。
注意:exec() 类函数可能被禁用(查看 disable_functions),且输出需清理换行和空格。
- 基础用法:
exec('find /path -name "*.conf" -type f', $output) - 避免注入风险:路径和模式必须过滤,推荐用
escapeshellarg()包裹变量,例如escapeshellarg($dir) - Windows 不支持
find(那是另一个命令),别硬套;如需跨平台,退回RecursiveDirectoryIterator - 结果是字符串数组,每行一个路径,末尾带换行符——用
array_map('trim', $output)清理
搜索结果去重与路径安全校验不能省
批量搜索常因软链接、挂载点或用户输入路径不规范,导致重复路径或越界访问(如 ../../../etc/passwd)。这不是“锦上添花”,而是防止路径遍历漏洞的关键步骤。
- 用
realpath()标准化路径后再比较:realpath($path) === $allowed_root - 去重别只靠
array_unique()—— 它对不同表示的同一路径无效(如./filevsfile),先realpath()再去重 - 绝对路径才可靠;相对路径在 CLI 和 Web 环境下工作目录不同,易出错,建议统一转为绝对路径再处理
- 如果搜索结果要返回给前端或写入日志,记得用
basename()提取文件名,避免暴露服务器路径结构
glob() 足够;中等深度目录用迭代器;超大或复杂条件,优先考虑 find,但务必做路径净化。



















