
本文详解如何使用 php 批量从 url 下载文件,将 `.adm` 扩展名统一替换为 `.txt`,再将所有文件内容追加写入一个汇总文本文件,并修正 `fputs()` 参数类型错误这一常见陷阱。
在自动化日志处理或批量数据采集场景中,常需从多个 URL 下载原始文件(如 .ADM 格式),统一转换格式后合并为单一可读文本(如 merged.txt)。但初学者易在文件 I/O 操作中混淆「文件资源」与「文件内容」——正如示例中 fputs($output, $file) 的报错:Warning: fputs() expects parameter 2 to be string, resource given,其根本原因在于 fputs() 的第二个参数必须是字符串内容,而非 fopen() 返回的资源句柄。
✅ 正确做法:内容导向,而非句柄传递
应避免先 fopen() 再误传资源给 fputs()。推荐两种安全高效的实现方式:
cqcms通用企业建站介绍 cqcms蓝色通用企业网站源码(带手机端)后台非常简单,一个后台同时管理PC和wap。把图片和文字稍加修改,就可以使用。适合任何企业网站 安装步骤: 1、下载文件,并且解压到网站的根目录,配置好apache/IIS虚拟主机以及伪静态;2、安装网址http://localhost/(localhost为您网址地址)3、网站后台入口 http://localhost/ad
方式一:使用 file_get_contents() + file_put_contents()(简洁推荐)
$outputFile = 'tmp/test.txt';
// 确保输出文件初始为空(首次运行时清空,后续用 FILE_APPEND 追加)
file_put_contents($outputFile, '', LOCK_EX); // 清空或创建空文件
foreach ($items as $logfile) {
$url = $logfile['Download'];
$originalName = $logfile['name'];
$newName = str_replace('.ADM', '.txt', $originalName); // 注意:.ADM 含点号,建议精确替换
// 下载并保存为 .txt 文件
$content = file_get_contents($url);
if ($content === false) {
error_log("Failed to download: {$url}");
continue;
}
file_put_contents($newName, $content);
// 将内容追加到汇总文件(注意 FILE_APPEND 和 LOCK_EX 防并发写入)
file_put_contents($outputFile, $content . "\n---\n", FILE_APPEND | LOCK_EX);
}方式二:使用流式读写(适合超大文件,内存友好)
$outputFile = 'tmp/test.txt';
$fpOut = fopen($outputFile, 'wb');
if (!$fpOut) {
throw new RuntimeException("Cannot open {$outputFile} for writing");
}
foreach ($items as $logfile) {
$url = $logfile['Download'];
$newName = str_replace('.ADM', '.txt', $logfile['name']);
// 下载并保存
$content = file_get_contents($url);
if ($content === false) continue;
file_put_contents($newName, $content);
// 安全写入:fputs 要求字符串,故直接传 $content
fputs($fpOut, $content . "\n---\n");
}
fclose($fpOut);⚠️ 关键注意事项
- 扩展名替换要严谨:str_replace('ADM','txt',...) 会错误替换文件名中任意位置的 "ADM"(如 "DEBUG.ADM.LOG" → "DEBUG.txt.LOG")。应使用 str_replace('.ADM', '.txt', ...) 或更健壮的 pathinfo() + basename() 组合。
- 错误处理不可省略:file_get_contents() 在网络失败时返回 false,必须检查,否则会导致空内容写入或崩溃。
- 并发安全:多进程写入同一文件时,务必使用 LOCK_EX(file_put_contents)或 flock()(流操作)防止内容错乱。
- 换行与分隔符:合并时添加 \n---\n 等分隔标记,便于后续人工或程序解析各源文件边界。
- 权限与路径:确保 tmp/ 目录存在且 Web 服务器有写权限;建议使用绝对路径(如 __DIR__ . '/tmp/test.txt')避免相对路径歧义。
✅ 总结
核心原则是:fputs() / fwrite() 的数据源必须是字符串,绝非文件指针。优先采用 file_get_contents() + file_put_contents() 组合,代码简洁、容错性强;仅在处理 GB 级大文件时,才需切换至 fopen + fread + fputs 的流式方案。同时,严谨的文件名处理、健全的异常捕获和并发控制,才是生产环境可靠运行的基石。









