php创建文件目录递归创建怎做_php递归建目录创文件【步骤】
技术百科
星夢妙者
发布时间:2026-01-25
浏览: 次 mkdir()递归创建目录必须传第三个参数true,否则多级路径会失败;权限参数0755在容器等环境可能受umask影响,需用chmod补全;is_dir()前须rtrim末尾斜杠以防误判。
mkdir() 第三个参数必须设为 true 才能递归创建
PHP 的 mkdir() 默认不支持递归,直接对不存在的父目录调用会失败并报 Warning: mkdir(): No such file or directory。必须显式传入第三个参数 true,否则哪怕路径里有好几层嵌套(比如 logs/2025/06/15),也会卡在第一级就中断。
常见错误写法:mkdir('logs/2025/06/15'); → 失败
正确写法:mkdir('logs/2025/06/15', 0755, true);
- 第二个参数是权限(八进制数,注意前面加
0,如0755) - 第三个参数
true表示递归创建所有缺失的上级目录 - Windows 下权限参数会被忽略,但
true仍必须传
用 is_dir() + mkdir() 组合避免重复创建警告
如果目录可能已存在,直接调用 mkdir() 会触发 Warning: mkdir(): File exists。不要依赖 @mkdir() 抑制错误——它掩盖真实问题,且无法区分“已存在”和“没权限”等不同失败原因。
更稳妥的做法是先检查:
if (!is_dir($path)) {
if (!mkdir($path, 0755, true)) {
throw new RuntimeException("Failed to create directory: $path");
}
}
-
is_dir()比file_exists()更准确:后者对文件也返回 true,而我们只关心目录 - 即使
mkdir()返回 false,也不代表完全失败(比如部分路径创建成功),所以检查返回值比单纯看 warning 更可靠
路径末尾斜杠会影响 is_dir() 判断结果
PHP 的 is_dir() 对末尾带斜杠的路径(如 'logs/')在某些系统(尤其是 Windows + 某些 PHP 版本)下可能返回 false,即使目录真实存在。这会导致误判、重复创建甚至报错。
解决方法统一用 rtrim($path, '/\\') 去掉末尾斜杠再判断:
$path = rtrim($path, '/\\');
if (!is_dir($path)) {
mkdir($path, 0755, true);
}
- 同时兼容 Unix 和 Windows 路径分隔符(
/和\) - 避免因路径格式不一致导致的逻辑分支错乱
- 尤其在拼接动态路径(如用户输入、配置项)时,这步不能省
权限 0755 在容器或共享主机中可能不生效
Linux 容器、Docker 或部分共享主机(如 cPanel)会受 umask 限制,即使你传了 0755,实际创建的目录权限可能是 0700 或 0750。这不是 PHP 错误,而是系统级行为。
验证方式:var_dump(substr(sprintf('%o', fileperms($path)), -4)); —— 查看真实权限
- 若需确保可读可执行,创建后可用
chmod($path强制补全(注意:仅对当前目录有效,不递归)
, 0755)
- 在 Docker 中,更推荐在构建镜像时用
RUN mkdir -p /var/log/app && chmod 755 /var/log/app预设权限 - 别指望
mkdir()在所有环境都精确还原你传的权限值
is_dir() 对末尾斜杠敏感——这些细节不处理,递归建目录看着简单,上线后却常在边缘 case 上出问题。
# ai
# 也不
# 看着
# 尤其是
# 也会
# 解决方法
# 第三个
# windows
# 镜像
# 第二个
# app
# 设为
# win
# linux
# docker
# 递归
# var
# php
# 这不是
# unix
# Directory
相关栏目:
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
AI推广<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
SEO优化<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
技术百科<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
谷歌推广<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
百度推广<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
网络营销<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
案例网站<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
精选文章<?muma echo $count; ?>
】
相关推荐
- 如何在 Go 中正确反序列化多个同级 XML 元素
- Win11怎么关闭触摸键盘图标_Windows11
- Mac如何设置动态壁纸?(让桌面动起来)
- php485读数据时阻塞怎么办_php485非阻塞
- Mac如何解压zip和rar文件?(推荐免费工具)
- php8.4新语法match怎么用_php8.4m
- C#如何使用Channel C#通道实现异步通信
- windows如何修改文件默认打开方式_windo
- Python数据抓取合法性_合规说明【指导】
- Windows10怎么卸载预装软件_Windows
- MAC如何修改默认应用程序_MAC文件后缀关联设置
- 如何在Golang中配置代码格式化工具_使用gof
- Windows11怎样开启游戏模式_Windows
- Mac如何修复应用程序权限问题_Mac磁盘工具修复
- Win11怎么更改输入法顺序_Win11调整语言首
- Python lxml的etree和Element
- Win11怎么打开旧版计算器_Win11恢复传统计
- Windows10怎么查看硬件信息_Windows
- 如何使用Golang实现云原生应用弹性伸缩_自动应
- 短链接怎么用php还原_从基础原理到代码实现教学【
- Linux如何安装Golang环境_Linux下G
- Win11关机界面怎么改_Win11自定义关机画面
- Win11怎么查看显卡显存_查询Win11显卡详细
- php485在macos下怎么配置_php485
- PythonWeb前后端整合项目教程_FastAP
- Win11怎么设置组合键快捷方式_Windows1
- php中$this和::能混用吗_对象与静态作用域
- Python多进程教程_multiprocessi
- Win11怎么制作U盘启动盘_Win11原版系统安
- 手机php怎么转mp4_手机端php文件转mp4a
- Win11如何设置开机自动联网 Win11宽带连接
- c++如何获取map中所有的键_C++遍历键值对提
- Python网络日志追踪_请求定位解析【教程】
- Windows10蓝屏代码DPC_WATCHDOG
- c++ nullptr与NULL区别_c++11空
- Win11怎么更改账户头像_Windows 11自
- Win11如何设置ipv6 Win11开启IPv6
- Win11怎么更改计算机名_Windows11系统
- php本地部署后数据库连接报错_1045acces
- Mac怎么查看活动监视器_理解Mac进程和资源占用
- Windows电脑如何截屏?(四种快捷方法)
- Win11怎么忘记WiFi网络_Win11删除已保
- 如何在同包不同文件中正确引用 Go 结构体
- Win11怎么查看wifi信号强度_检测Windo
- 如何解决同一段404代码在不同主机上表现不一致的问
- Mac自带的词典App怎么用_Mac添加和使用多语
- C++中引用和指针有什么区别?(代码说明)
- Golang如何实现基本的用户注册_Golang用
- Windows执行文件被SmartScreen拦截
- How to Properly Use NumPy


QQ客服