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'); // ❌ 错误:第一个参数必须是 resour
ce,不是文件名正确流程:
fopen('test.txt', 'w') 获取合法文件句柄(resource)false(权限不足、路径不可写等会导致失败)fwrite
fopen 模式选错会导致内容被清空或追加错位写新文件最常用的是 'w' 和 'a',但行为完全不同:
'w':清空文件内容再写入,文件不存在则创建;存在但只读则失败'a':总在末尾追加,文件不存在也创建;但即使文件存在,fwrite 也不会覆盖原有内容'x':仅当文件不存在时创建并打开(安全模式,避免误覆盖)例如想“确保新建空白文件”,用 'w' 不够安全(可能误删旧数据),更稳妥是:
$fp = fopen('log.txt', 'x'); // ✅ 失败说明文件已存在若需原子性写入(防止写到一半中断留下脏数据),应先写临时文件,再 rename() 替换原文件。
fwrite 不做字符集转换fwrite 是纯字节写入函数,不关心编码。如果 PHP 源码是 UTF-8,但文件被其他程序(如 Windows 记事本)以 ANSI 打开,就会显示乱码。
mb_convert_encoding($str, 'UTF-8', 'GBK'))fwrite($fp, "\xEF\xBB\xBF");(仅对 UTF-8 有效)另外,fwrite 返回实际写入字节数,可用来校验是否完整写入:
$len = fwrite($fp, $content);
if ($len !== strlen($content)) { /* 写入截断,可能磁盘满或权限变化 */ }
fclose,否则可能丢数据或锁住文件PHP 脚本结束时会自动关闭资源,但显式调用 fclose($fp) 更可靠:
fwrite 可能缓存,fclose 强制刷新)更健壮的写法是用 try/finally(PHP 5.5+)或判断后强制关闭:
$fp = fopen('data.txt', 'w');
if ($fp === false) die('无法打开文件');
try {
fwrite($fp, $data);
} finally {
fclose($fp);
}注意:fclose 对已关闭的句柄调用会触发警告,所以不要重复关。