php创建文件用fwrite注意啥_phpfwrite创文件要点【实例】

6次阅读

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

php创建文件用fwrite注意啥_phpfwrite创文件要点【实例】

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')
  • 必要时在文件开头写 bomfwrite($fp, "xEFxBBxBF");(仅对 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 对已关闭的句柄调用会触发警告,所以不要重复关。

text=ZqhQzanResources