PHP mkdir函数在Windows下忽略mode参数,Linux下受umask影响导致实际权限常为0755而非0777,递归创建需设true且注意父目录写权限,路径长度Windows限260字符而Linux较宽松。

PHP 的 mkdir 函数在 Windows 和 Linux 下核心行为一致,但关键差异集中在权限处理、路径限制和系统级约束上。
权限参数($mode)是否生效
Linux 下 $mode 严格起作用,比如 mkdir('/a/b/c', 0755, true) 会实际设置目录权限为 rwxr-xr-x;而 Windows 完全忽略该参数,新建目录权限由系统继承或用户策略决定,传 0777 或 0644 效果一样。
递归创建($recursive)行为一致但需注意前提
从 PHP 5.0.0 起,两个平台都支持 mkdir($path, $mode, true) 逐级建目录。但 Linux 下若某级父目录存在但不可写(如权限为 0555),仍会失败;Windows 下只要当前用户有写权限,通常能成功,不过需确保路径中不含非法字符(如 : " | ? *)。
Linux 安全审计工具,检查 SSH 配置、开放/监听端口、防火墙规则(ufw/iptables/nftables)、失败登录尝试、sudoers 权限...
路径长度与字符限制
Windows 默认路径长度上限为 260 字符(MAX_PATH),超长路径易触发 Warning: mkdir(): No such file or directory,即使加了 true 也无效;Linux 一般无此硬限制(取决于文件系统,如 ext4 支持更长路径),但要注意挂载选项或容器环境可能额外设限。
其他实际差异点
- Linux 下需关注 SELinux、Docker 容器的 Capabilities 或用户组权限(如
www-data是否对父目录有w权限) - Windows 下要注意反斜杠
\转义问题,建议统一用正斜杠/或DIRECTORY_SEPARATOR -
umask在 Linux 下会影响最终权限(例如umask(0022)会让0777实际变成0755),Windows 不受 umask 影响
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!










