php创建文件最直接用fopen()配fclose(),无单独新建函数;"w"覆盖写、"x"仅新建;file_put_contents()省事但需判返回值;mkdir()需递归建父目录;注意跨平台路径与权限差异。

用 fopen() 创建文件最直接,但得配 fclose()
PHP 没有单独的“新建空文件”函数,fopen() 是实际干活的那个——它在模式为 "w" 或 "x" 时会创建新文件。很多人卡在写完没关句柄,导致后续写入失败或磁盘缓存不刷新。
-
"w"模式:文件存在就清空重写,不存在才创建;适合覆盖场景 -
"x"模式:只创建,文件已存在直接返回false,适合防止误覆盖 - 必须配
fclose($fp),否则内容可能没真正落盘,尤其在 CLI 环境下更明显 - 示例:
$fp = fopen("log.txt", "a"); fwrite($fp, "done\n"); fclose($fp);(注意用"a"追加时也会自动创建)
file_put_contents() 更省事,但默认不报错
它把打开、写入、关闭三步合成一个函数,适合简单写字符串场景。但默认静默失败,容易让你以为写成功了,其实因为权限或路径问题根本没建出来。
- 加上
FILE_USE_INCLUDE_PATH或LOCK_EX参数会影响行为,不用就别加 - 强烈建议配合返回值判断:
if (file_put_contents("data.json", $json) === false) { /* 失败处理 */ } - 注意:它不会自动创建父目录,
"./logs/app.log"中logs/不存在就会失败 - 如果要原子写入(避免读到半截内容),用
file_put_contents($f, $d, LOCK_EX)
目录不存在时,mkdir() 得递归 + 设权限
想写 ./cache/user/123.json?先得确保 cache/user/ 存在。直接 fopen() 或 file_put_contents() 都不会帮你建中间目录。
- 用
mkdir(dirname($path), 0755, true),第三个参数true表示递归创建 - 权限
0755是常见选择,但 Web 服务器用户(如 www-data)得有写权限,有时得设成0775并配好组 - 不要用
0777,尤其在线上环境,等于敞开大门 - 创建后最好用
is_writable()再确认一次,比靠运气强
Windows 和 Linux 路径分隔符、权限逻辑完全不同
本地开发用 Windows,部署到 Linux 服务器?路径拼接出错、权限拒绝、文件名大小写敏感……这些坑不是报错信息告诉你的,是半夜线上日志突然不写了你才发现的。
立即学习“PHP免费学习笔记(深入)”;
- 永远用
dirname(__FILE__)或__DIR__拼路径,别手写"../config/" - Linux 下
file_put_contents("/tmp/test", "x")成功不代表 PHP 进程能往/var/www/html/写——得看运行用户(如 apache 或 nginx)是否有该目录的w权限 - Windows 不区分
File.php和file.php,Linux 会当两个文件,类自动加载或include时容易找不到 - 用
realpath($path)检查路径是否真实可达,比file_exists()更早暴露符号链接或挂载问题
文件操作看着简单,真正麻烦的是路径是否可达、权限是否匹配、句柄是否释放、目录是否提前存在——这四点没对齐,函数再对也没用。











