PHP创建新文件最可靠方式是fopen()配'x'模式:仅当文件不存在时创建,配合is_dir()和mkdir()确保父目录存在,避免覆盖与竞态条件。

PHP 创建文件最常用、最可靠的方式是 fopen() 配合 'w' 或 'x' 模式,而不是 touch() 或 file_put_contents() 的某些用法——后者在权限或并发场景下容易静默失败。
用 fopen() 安全创建新文件(推荐)
直接调用 fopen($path, 'w') 会清空已有内容,不满足“仅新建”需求;真正保证“只创建、不覆盖”的是 'x' 模式(PHP 4.3.2+):
-
'x':仅当文件不存在时创建并打开,失败返回false,不会覆盖 -
'x+':同上,但允许读写(适合后续立即写入) - 必须配合
is_dir()检查父目录是否存在,否则fopen()会报Warning: fopen(): No such file or directory
示例:
$path = '/tmp/data.txt';
$dir = dirname($path);
if (!is_dir($dir) && !mkdir($dir, 0755, true)) {
throw new RuntimeException("无法创建目录: $dir");
}
$fp = fopen($path, 'x');
if ($fp === false) {
throw new RuntimeException("文件已存在或权限不足: $path");
}
fwrite($fp, "hello\n");
fclose($fp);
为什么不用 file_put_contents()?
它默认行为是“写入或覆盖”,即使加 FILE_APPEND 也解决不了“仅新建”问题。有人用 FILE_EXISTS_SKIP(PHP 8.3+),但该标志尚未广泛部署,且仍需手动处理目录和权限:
云模块_YunMOK网站管理系统采用PHP+MYSQL为编程语言,搭载自主研发的模块化引擎驱动技术,实现可视化拖拽无技术创建并管理网站!如你所想,无限可能,支持创建任何网站:企业、商城、O2O、门户、论坛、人才等一块儿搞定!永久免费授权,包括商业用途; 默认内置三套免费模板。PC网站+手机网站+适配微信+文章管理+产品管理+SEO优化+组件扩展+NEW Login界面.....目测已经遥遥领先..
立即学习“PHP免费学习笔记(深入)”;
-
file_put_contents($path, $content, LOCK_EX)不防覆盖,只防并发写入冲突 -
file_exists($path)+file_put_contents()存在竞态条件(check-then-act 问题) - 老版本 PHP(FILE_EXISTS_SKIP,强行模拟易出错
权限与路径的坑必须提前处理
PHP 进程用户(如 www-data 或 nginx)对目标目录要有 w+x 权限(写 + 进入目录),否则 fopen('x') 直接失败,错误信息常被忽略:
- 错误现象:
fopen(): Permission denied或静默返回false - 检查命令:
ls -ld /tmp(确认目录可写可执行)、id -un(确认 PHP 运行用户) - 相对路径慎用:
fopen('log.txt', 'x')依赖当前工作目录(getcwd()),线上环境往往不可控 - 绝对路径更稳,建议用
__DIR__ . '/files/output.txt'构造
真正难的不是写几行代码,而是确保目录存在、权限到位、模式选对——这三个点漏掉任何一个,fopen() 就会一声不响地返回 false,而你还在查语法。










