文件打开模式错误、fwrite返回值未检查、缓冲未刷新或句柄未关闭、权限路径及磁盘空间不足是fwrite写入失败的五大主因,需逐一排查。

文件打开模式是否正确
最常见的原因是 fopen() 用错了模式,比如用 'r'(只读)或 'a'(追加但不截断)却想覆盖写入,或者漏了 'b' 导致 Windows 下换行符异常。fwrite 要成功写入,文件句柄必须是可写的,且打开时没报错。
-
'w':清空文件并写入,适合覆盖场景;'w+'可读可写 -
'a':光标始终在末尾,无法用fseek()改变位置,fwrite()总是追加 - 二进制模式(如
'wb')更安全,尤其处理非文本内容或跨平台时 - 务必检查
fopen()返回值:if (!$fp = fopen('file.txt', 'w')) { die('无法打开文件'); }
fwrite 返回值被忽略
fwrite() 不是“调用就完事”,它返回实际写入的字节数,失败时返回 false。很多人只调用不检查,结果写入 0 字节也毫无察觉。
- 典型错误写法:
fwrite($fp, $data);—— 完全没确认是否成功 - 应检查:
$n = fwrite($fp, $data); if ($n === false) { echo '写入失败'; } - 注意:
0是合法返回值(比如写空字符串),所以必须用=== false判断失败,不能用== false或!$n
文件句柄未关闭或缓冲未刷新
PHP 默认启用输出缓冲,尤其是使用 fopen() 打开的文件流,在脚本结束前可能还没真正落盘。如果程序提前 exit、发生 fatal error,或用了 fflush() 之前就关了句柄,数据就丢了。
- 写完后显式调用
fflush($fp)强制刷缓冲区 - 确保最终调用
fclose($fp)—— 它会自动 flush,但别依赖它,先 flush 再 close 更稳妥 - 避免在循环中反复
fopen/fwrite/fclose,性能差还容易因异常遗漏fclose;应打开一次,批量写,再关闭
权限、路径和磁盘空间问题
看起来代码没问题,但系统层面卡住了:目录不可写、路径不存在、磁盘满、SELinux 限制(Linux)、或 Windows 下文件被其他进程占用(如 Excel 正在编辑该 CSV)。
立即学习“PHP免费学习笔记(深入)”;
- 用
is_writable(dirname($path))检查目录是否可写,不要只查文件是否存在 - 绝对路径比相对路径更可靠,
__DIR__ . '/data/output.txt'比'output.txt'少歧义 - 写入前简单探测:
if (disk_free_space(dirname($path)) - Windows 下若文件正被记事本/Excel 打开,
fopen()可能静默失败或只读打开,需人工确认
最常被跳过的其实是检查 fopen() 是否成功,以及把 fwrite() 当作“无返回值函数”来用。一旦加上这两层判断,八成的“没写进去”问题当场定位。



















