追加内容必须用'a'或'a+'模式而非'w':前者自动定位文件末尾且不覆盖,后者还支持读取;file_put_contents()需显式加file_append标志;并发写入须用flock()加锁;中文乱码主因是编码与查看工具不匹配。

用 fopen() 打开文件时必须选对模式
追加内容的核心在于打开文件的方式——不能用 'w'(清空写入),得用 'a' 或 'a+'。前者只允许追加,后者还支持读取;两者都会自动将文件指针定位到末尾,且不覆盖原有数据。
常见错误是误用 'w' 或 'c' 模式:'w' 会截断文件,'c' 虽不截断但也不自动定位到末尾,需手动 fseek(),容易出错。
-
'a':文件不存在则创建,存在则追加;只能写,不能读 -
'a+':同上,但可读可写(读操作需配合fseek()移动指针) - 避免
'w'、'w+'、'c'—— 它们都不保证“追加”语义
fwrite() 和 file_put_contents() 的行为差异
fwrite() 需要先 fopen(),适合多次连续写入;file_put_contents() 是封装好的单次操作,更简洁,但要注意它的 FILE_APPEND 标志。
不加标志的 file_put_contents() 默认覆盖,这是最常踩的坑。
立即学习“PHP免费学习笔记(深入)”;
- 用
fwrite():先$fp = fopen('log.txt', 'a');,再fwrite($fp, "new line\n");,最后fclose($fp); - 用
file_put_contents():必须显式传FILE_APPEND,如file_put_contents('log.txt', "new line\n", FILE_APPEND); - 如果还要确保换行或编码一致,建议在内容末尾手动加
\n,尤其日志场景
并发写入时可能丢数据?得加锁
多个 PHP 进程/请求同时向同一个文件追加,即使用了 'a' 模式,仍可能因系统调用非原子性导致内容交错(比如两行文字挤在同一行)。
Linux 下 flock() 是最轻量的解决方式,Windows 也支持基本文件锁。
- 使用
fopen()+flock()组合:打开后立即flock($fp, LOCK_EX),写完flock($fp, LOCK_UN) -
file_put_contents()不自带锁,若需安全追加,应改用fopen()流式写法 - 注意:锁只对同样使用
flock()的进程有效;纯 shell 命令(如echo >>)不参与 PHP 的锁机制
中文内容写入乱码?检查文件打开前的编码处理
PHP 默认按字节写入,不处理编码转换。如果源字符串是 UTF-8,而文件本身被其他程序(如 Windows 记事本)以 ANSI 打开,就会显示乱码——这不是写入逻辑问题,而是终端解释问题。
- 确保写入前字符串是 UTF-8(如从数据库或 HTTP 请求来的内容)
- 必要时在文件开头写 BOM:
fwrite($fp, "\xEF\xBB\xBF");(仅对某些旧编辑器有效) - 更可靠的做法是统一用 UTF-8 编码保存,并让查看工具(如 VS Code、Notepad++)正确识别编码
- 避免用
mb_convert_encoding()盲转——除非你明确知道源编码











