glob() 是批量任务中快速获取文件列表的首选方法,支持通配符、自动过滤.和..,正确用法为 glob('pattern')而非加尾部斜杠,返回空数组而非false,配合file_get_contents()/file_put_contents()可高效完成90%轻量级处理。

用 glob() 快速获取待处理文件列表
批量任务第一步永远是“找对文件”,glob() 比 scandir() 更直接,支持通配符且天然过滤掉 . 和 ..。别手写 opendir() + readdir() 循环——除非你要精确控制遍历逻辑或处理超大目录。
常见错误:路径末尾加斜杠后 glob('logs/*.log/') 会返回空数组,因为 / 不是通配符合法部分;正确写法是 glob('logs/*.log')。
-
glob('data/*.csv')匹配当前目录下所有 CSV 文件 -
glob('src/**/*.php')(PHP 7.4+)可递归匹配,但注意性能,深层嵌套时建议改用RecursiveIteratorIterator - 结果为空时
glob()返回空数组,不是false,别用=== false判断失败
用 foreach + file_get_contents()/file_put_contents() 做轻量级批量处理
90% 的简单批量任务(比如批量替换文本、追加日志头、转码 JSON 文件)不需要开多进程或队列,直接循环读写最稳。关键点是别在循环里做阻塞操作(如远程请求、数据库写入),否则容易超时或锁表。
示例:给所有 .txt 文件开头插入时间戳
立即学习“PHP免费学习笔记(深入)”;
$files = glob('notes/*.txt');
foreach ($files as $file) {
$content = file_get_contents($file);
file_put_contents($file, date('Y-m-d H:i:s') . "\n" . $content);
}
- 大文件慎用
file_get_contents(),内存爆掉前先用fopen()+fgets()流式处理 -
file_put_contents($file, $data, FILE_APPEND)比手动fopen(..., 'a')更简洁,但要注意并发写入冲突(单机脚本一般不需考虑) - 务必检查
file_get_contents()返回值是否为false,避免把错误信息当内容处理
用 pcntl_fork() 或 exec() 控制并发数防卡死
当文件数超过几百个,或每个文件处理耗时明显(比如调用外部命令、解析大 XML),串行太慢,但一股脑全开子进程又可能打满 CPU 或内存。这时候需要显式控并发。
pcntl_fork() 精确但仅限 CLI 模式且 Windows 不支持;更通用的做法是用 exec() 调起多个独立 PHP 进程,配合 waitpid() 或简单 sleep 轮询。
- 用
pcntl_fork()时,子进程必须调用exit(),否则会继续执行后续循环,造成进程爆炸 - 用
exec('php process.php ' . escapeshellarg($file) . ' > /dev/null &')启动后台任务,记得escapeshellarg()防注入 - 并发数别硬写死,根据服务器内存设上限,比如 16 核机器跑 8 个并发通常比较安全
错误处理和进度反馈不能省
批量任务一旦出错,没人盯着就等于静默失败。不要只靠 try/catch——很多文件操作(如权限不足)抛的是 warning,不是 exception。
关键动作:开启 error_reporting(E_ALL),捕获 @file_get_contents() 的失败,记录失败文件路径和 $php_errormsg(或改用 error_get_last())。
- 用
ob_flush()+flush()实时输出进度(CLI 下有效),比如每处理 10 个文件echo "✅ $i/".count($files)."\n" - 把失败项写进
failed.log,而不是只 echo 到屏幕,否则重定向输出后就丢了 - 临时文件操作(如生成新文件再 rename 覆盖)比直接覆盖更安全,避免中断导致损坏原文件
真正麻烦的不是代码怎么写,而是你没提前想好:某个文件编码异常、磁盘突然写满、某次 file_put_contents() 返回 false 却没检查——这些细节漏一个,整批任务就得重跑。



















