在PHP开发中,我们经常需要把一些运行日志、用户操作记录或者接口返回结果写到文件里。如果处理不当,新的写入会把文件里原来的内容全部清空,造成数据丢失。要想实现追加写入而不覆盖,PHP给出了几种非常直接的方式。

使用file_put_contents追加写入
file_put_contents是最简单的文件写入函数,它默认会覆盖文件。只要加上FILE_APPEND参数,就能变成追加模式。如果需要同时禁止文件锁带来的阻塞,还可以用竖线连接FILE_APPEND和LOCK_EX。
<?php
$file = 'log.txt';
$content = date('Y-m-d H:i:s') . " 用户登录成功n";
// 第三个参数传入FILE_APPEND实现追加,不覆盖原内容
file_put_contents($file, $content, FILE_APPEND);
// 如果担心并发写入混乱,可以加上锁
file_put_contents($file, $content, FILE_APPEND | LOCK_EX);
echo "写入完成";
?>
使用fopen与fwrite控制写入
另一种方式是先用fopen打开文件,模式选a或者a+。其中a表示写入时指针放在文件末尾,如果文件不存在就新建;a+除了写入还能读取。打开后使用fwrite把内容写进去,最后用fclose关闭。
<?php
$file = 'data.txt';
$handle = fopen($file, 'a'); // a模式追加写入
if ($handle) {
$text = "新的一行数据n";
fwrite($handle, $text);
fclose($handle);
echo "已追加写入";
} else {
echo "文件打开失败";
}
?>
两种办法的对比
下面用表格列出它们的主要区别,方便根据实际场景选择。
| 方式 | 代码复杂度 | 是否支持锁 | 适用场景 |
|---|---|---|---|
| file_put_contents加FILE_APPEND | 低,一行搞定 | 可配合LOCK_EX | 简单日志、少量写入 |
| fopen加fwrite | 稍高,需手动关文件 | 需自己加锁逻辑 | 需要边读边写或复杂控制 |
常见注意点
- 文件路径要有写权限,否则追加会失败。
- 在循环里频繁调用file_put_contents时,建议用LOCK_EX避免内容交错。
- 用
fopen()打开后一定要fclose(),否则可能写不进磁盘。
总结来说,PHP追加写入不覆盖的核心就是告诉函数或文件句柄:把指针放到末尾再写,而不是从头开始。掌握FILE_APPEND和a模式,就能稳定地保留历史数据。
PHP文件追加写入file_put_contents修改时间:2026-07-31 00:24:18