glob()是php轻量级文件名匹配函数,支持*、?、[]通配符,返回完整路径数组,空结果为空数组而非false,不递归、不查内容,适用于单层目录固定模式搜索。

用 glob() 快速匹配文件名(最常用)
glob() 是 PHP 原生支持的轻量方案,适合按通配符搜索当前目录或单层子目录下的文件。它不递归、不查内容、只比对路径和文件名,但胜在快且无需额外扩展。
- 如果你只想找
logs/<em>.log</em>或config/.php这类固定结构的文件,直接用glob()就够了 - 注意返回的是完整路径数组,空结果时返回空数组,不是
false;要判空用empty($files),别用=== false - Windows 下大小写不敏感,Linux 下敏感;比如
glob('*.PHP')在 Linux 可能匹配不到index.php - 通配符只支持
*、?和[...],不支持正则;想用正则得配合array_filter()+preg_match()
$files = glob('data/*.json');
if (!empty($files)) {
foreach ($files as $file) {
echo basename($file) . "\n";
}
}
用 RecursiveDirectoryIterator 递归遍历(需要查子目录)
当搜索范围涉及多层嵌套(比如整个 src/ 目录),glob() 不够用,就得上迭代器。这不是“高级用法”,而是实际项目里最常踩坑的地方——很多人硬套 scandir() 写递归,结果遇到符号链接卡死或深度过大报错。
- 必须包裹在
try/catch里,因为权限不足或路径不存在会抛出UnexpectedValueException - 默认跳过
.和..,但不会自动过滤隐藏文件(如.env);需手动用isDot()或正则排除 - 性能上比
glob()慢,尤其目录层级深、文件多时;如果只是想找某个特定名字的文件,找到后建议用break提前退出
$it = new RecursiveIteratorIterator(new RecursiveDirectoryIterator('app/'));
foreach ($it as $file) {
if ($file->isFile() && $file->getFilename() === 'routes.php') {
echo $file->getPathname() . "\n";
break;
}
}
用 exec() 调系统命令(Linux/macOS 下更灵活)
PHP 自带函数对复杂搜索力不从心,比如“找出 7 天内修改过、且文件名含 cache 的所有 .tmp 文件”。这时候直接调 find 更可靠,前提是服务器允许执行外部命令(disable_functions 里没禁掉 exec)。
- Windows 用户可用
dir /s /b,但语法和行为与find差异大,跨平台代码会变脆弱 - 输出默认带换行符,用
array_filter(array_map('trim', $output))清理更安全 - 一定要对用户输入的关键词做
escapeshellarg(),否则可能被注入命令(比如搜索; rm -rf /) - 返回的是字符串数组,不是
SplFileInfo对象,后续要获取大小、时间等元信息,得再调stat()
$searchTerm = escapeshellarg('config');
$cmd = "find /var/www -name '*{$searchTerm}*' -type f -mtime -7 2>/dev/null";
exec($cmd, $output);
$files = array_filter(array_map('trim', $output));
为什么不用 file_get_contents() 搜索文件内容?
很多人第一反应是“把每个文件读进来,用 strpos() 找关键词”,这在小项目里看似可行,但实际一上线就出问题:
- 单个 10MB 的日志文件就能让脚本内存溢出(
file_get_contents()会全载入内存) - 没做编码检测,UTF-8 和 GBK 混合时
strpos()可能漏匹配或报错 - 二进制文件(图片、PDF)读出来是乱码,
strpos()结果不可靠 - 真要搜内容,应该用
grep -r或专用库(如 Symfony Finder),而不是手撸
真正需要内容搜索时,优先考虑:
- 小文本:用
grep -l "keyword" *.php配合exec() - 大文件:逐行读(
fgets())+ 正则,避免全加载 - 高频需求:引入 Elasticsearch 或 SQLite 全文索引,别硬扛
路径、权限、编码、内存——这些不是边缘情况,是每次写文件搜索时都绕不开的具体约束。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











