fwrite必须配合fopen使用,先用fopen以'w'、'a'或'x'等模式打开文件获取资源句柄,再传给fwrite写入;直接fwrite会报错;写完需fclose确保数据写入磁盘。

用 fwrite 创建文件前必须先用 fopen 打开
fwrite 本身不创建也不打开文件,它只向已打开的文件句柄写入数据。如果文件不存在,fopen 在 'w' 或 'a' 模式下会自动创建;但若直接调用 fwrite 而没先 fopen,会报 Warning: fwrite(): supplied resource is not a valid stream resource。
常见错误写法:
fwrite('test.txt', 'hello'); // ❌ 错误:第一个参数必须是 resource,不是文件名正确流程:
- 用
fopen('test.txt', 'w')获取合法文件句柄(resource) - 检查返回值是否为
false(权限不足、路径不可写等会导致失败) - 再传给
fwrite
fopen 模式选错会导致内容被清空或追加错位
写新文件最常用的是 'w' 和 'a',但行为完全不同:
立即学习“PHP免费学习笔记(深入)”;
-
'w':清空文件内容再写入,文件不存在则创建;存在但只读则失败 -
'a':总在末尾追加,文件不存在也创建;但即使文件存在,fwrite也不会覆盖原有内容 -
'x':仅当文件不存在时创建并打开(安全模式,避免误覆盖)
例如想“确保新建空白文件”,用 'w' 不够安全(可能误删旧数据),更稳妥是:
$fp = fopen('log.txt', 'x'); // ✅ 失败说明文件已存在若需原子性写入(防止写到一半中断留下脏数据),应先写临时文件,再 rename() 替换原文件。
中文内容写入乱码?注意文件编码和 fwrite 不做字符集转换
fwrite 是纯字节写入函数,不关心编码。如果 PHP 源码是 UTF-8,但文件被其他程序(如 Windows 记事本)以 ANSI 打开,就会显示乱码。
- 确保 PHP 输出的字符串本身是目标编码(如
mb_convert_encoding($str, 'UTF-8', 'GBK')) - 必要时在文件开头写 BOM:
fwrite($fp, "\xEF\xBB\xBF");(仅对 UTF-8 有效) - Linux/macOS 下一般无 BOM 更稳妥;Windows 环境下某些编辑器依赖 BOM 识别 UTF-8
另外,fwrite 返回实际写入字节数,可用来校验是否完整写入:
$len = fwrite($fp, $content);
if ($len !== strlen($content)) { /* 写入截断,可能磁盘满或权限变化 */ }
写完别忘 fclose,否则可能丢数据或锁住文件
PHP 脚本结束时会自动关闭资源,但显式调用 fclose($fp) 更可靠:
- 避免长时间占用文件句柄(尤其在循环中反复操作同一文件)
- 确保缓冲区真正刷入磁盘(
fwrite可能缓存,fclose强制刷新) - Windows 下未关闭的文件可能被其他进程拒绝访问
更健壮的写法是用 try/finally(PHP 5.5+)或判断后强制关闭:
$fp = fopen('data.txt', 'w');
if ($fp === false) die('无法打开文件');
try {
fwrite($fp, $data);
} finally {
fclose($fp);
}注意:fclose 对已关闭的句柄调用会触发警告,所以不要重复关。











