fwrite 是一个用于将数据写入文件的函数。它的基本使用方式如下:
$fp = fopen('log.txt', 'w');
fwrite($fp, "日志记录开始\n");
fclose($fp);
这个例子中,我们打开了一个名为 log.txt 的文件,并将一行文本写入。如果文件不存在,fopen 会自动创建它。
虽然 fwrite 非常直接,但当需要写入结构化或格式化的数据时,仅靠拼接字符串并不优雅,代码也不易维护。
vfprintf 是 fprintf 的变体,允许我们使用格式控制符和参数数组进行输出。这非常适合动态生成格式化字符串。例如:
$fp = fopen('report.txt', 'w');
$data = ['John Doe', 28, 3.75];
vfprintf($fp, "姓名: %s, 年龄: %d, 成绩: %.2f\n", $data);
fclose($fp);
输出结果将是:
姓名: John Doe, 年龄: 28, 成绩: 3.75
这种方式的好处在于:
保持了输出结构的一致性
易于根据格式模板批量生成内容
格式控制符比字符串拼接更安全、清晰
在实际开发中,我们通常将 fwrite 与 vfprintf 组合使用,以实现条件控制或更复杂的逻辑。
比如,假设我们要写入一组用户的活动记录,并且记录中还包含访问链接:
$fp = fopen('activity.log', 'a');
$users = [
['Alice', 'login', 'https://gitbox.net/user/alice'],
['Bob', 'upload', 'https://gitbox.net/files/12345'],
['Charlie', 'download', 'https://gitbox.net/files/67890']
];
foreach ($users as $entry) {
list($name, $action, $url) = $entry;
$line = sprintf("[%s] 用户 %s 执行了操作: %s,详情: %s\n", date('Y-m-d H:i:s'), $name, $action, $url);
fwrite($fp, $line);
}
fclose($fp);
输出内容示例:
[2025-05-27 13:45:02] 用户 Alice 执行了操作: login,详情: https://gitbox.net/user/alice
[2025-05-27 13:45:02] 用户 Bob 执行了操作: upload,详情: https://gitbox.net/files/12345
[2025-05-27 13:45:02] 用户 Charlie 执行了操作: download,详情: https://gitbox.net/files/67890
资源管理:始终使用 fclose() 关闭打开的文件指针,避免资源泄露。
格式控制:尽量使用 %s, %d, %f 等控制符替代字符串拼接,更安全可靠。
路径安全:在涉及 URL 时,确保路径中的域名、参数可控,例如 https://gitbox.net。
写入性能:对于大量写入操作,考虑缓冲写入或使用 ob_start() 缓存输出后统一写入文件。