fwrite() 必须配合 fopen() 和 fclose() 使用,其行为由 fopen() 的 mode 决定:“w”覆盖、“a”追加、“x”防覆盖;返回实际字节数,需用 === false 判断错误;二进制写需“b”模式;中文、换行、并发需额外处理。

fwrite() 不是独立可用的函数,它必须配合 fopen() 和 fclose() 一起用。单独调用 fwrite() 会报错,因为没有有效的文件指针;不关文件则可能丢数据、占资源、并发写乱序。
必须先用 fopen() 打开文件,且模式要选对
写入行为完全由 fopen() 的 mode 参数决定,fwrite() 本身不控制覆盖还是追加:
-
"w":清空原文件,从头开始写 —— 写日志配置时容易误删旧内容 -
"a"或"a+":光标自动移到末尾再写,安全适合日志追加 -
"x":文件不存在才创建,存在直接失败 —— 防误覆盖的硬性保护 - Windows 下写二进制(如图片、PDF),mode 必须带
"b",比如"wb",否则换行符可能被悄悄转义
fwrite() 的返回值不是“成功/失败”,而是“写了几个字节”
它返回的是实际写入的字节数(int),不是布尔值。常见误判写法:
if (fwrite($fp, $data)) { ... } // 错!0 字节也返回 0,会被当成 false
正确判断方式:
立即学习“PHP免费学习笔记(深入)”;
- 用
=== false检查是否出错:if (fwrite($fp, $data) === false) - 网络流或大文件写入时,
fwrite()可能只写一部分就返回(比如缓冲区满),需循环写或改用stream_copy_to_stream() - 中文字符在 UTF-8 下占多个字节,
fwrite($fp, "你好", 2)可能只写出半个汉字,造成乱码
换行、锁、并发:三个容易被跳过的现实问题
写文本文件时,别只依赖 "\n":
- 跨平台兼容要手动处理换行符:
PHP_OS_FAMILY === 'Windows' ? "\r\n" : "\n" - 多进程/多请求同时写一个日志文件,不加锁会丢行或错位 —— 用
flock($fp, LOCK_EX)包住fwrite()调用 - 如果只是简单追加一行,
file_put_contents($file, $line . PHP_EOL, FILE_APPEND | LOCK_EX)比手写fopen+fwrite+fclose更稳
真正麻烦的从来不是语法,而是写入位置是否准确、并发时是否丢数据、中文和换行是否正常显示 —— 这些都得在 fopen() 模式、fwrite() 返回值检查、以及外围加锁/换行处理上做实。



















