用 fopen() 追加内容必须选 "a" 模式,它自动将指针移至文件末尾且不覆盖原内容;"w" 会清空文件,"a+" 需手动 fseek 才能确保追加;file_put_contents() 配合 file_append 更简洁,但需注意权限、路径、换行和并发问题。

用 fopen() 追加内容必须选 "a" 模式
PHP 写文件时,"a" 模式是唯一真正“追加到末尾”的方式——它自动将文件指针移到 EOF,且不会清空原内容。别用 "w"(会覆盖)或 "a+"(虽可读但默认不移动指针,容易误写到开头)。
-
"a":只写,指针始终在末尾,文件不存在则创建 -
"a+":可读可写,但写入前需手动fseek($fp, 0, SEEK_END),否则可能覆盖开头 -
"w"或"w+":一打开就清空文件,不是追加
file_put_contents() 是最简追加方案
不用手动管理句柄,一行搞定,底层就是 fopen(..., "a") + fwrite() + fclose()。适合日志、简单记录等场景。
- 必须传
FILE_APPEND标志,否则默认是覆盖:file_put_contents("log.txt", "msg\n", FILE_APPEND) - 如果文件不存在,会自动创建;目录不存在则报错,得提前
mkdir(..., 0755, true) - 并发写入时可能丢行(无原子锁),高并发日志建议用
error_log()或专用队列
追加失败常见原因和排查点
不是代码写错,往往是权限或路径问题,错误信息常藏在 fopen() 返回 false 或 file_put_contents() 返回 false 里。
- 检查路径是否写错:
"./logs/app.log"和"logs/app.log"在不同工作目录下行为不同 - 确认 PHP 进程有写权限:
ls -l logs/看属组,必要时chown www-data:www-data logs/ - 磁盘满或 inodes 耗尽也会静默失败,用
df -h和df -i查 - Windows 下注意路径分隔符,
"C:\logs\app.log"要写成"C:/logs/app.log"或双反斜杠
大文件追加要注意性能和换行
每次追加都 fopen → fwrite → fclose 开销不小;另外没换行符会导致所有内容挤成一行,排查困难。
立即学习“PHP免费学习笔记(深入)”;
- 高频写入时,建议复用文件句柄(
fopen一次,循环fwrite多次,最后fclose),避免反复系统调用 - 每条记录结尾加
"\n"(Unix)或"\r\n"(Windows),别依赖用户输入自带换行 - 超大日志(>100MB)考虑轮转,用
logrotate或 PHP 判断文件大小后重命名再新建
logs/ 目录根本没被创建,或者 SELinux 把写权限拦了。











