PHP mkdir()在Windows下忽略权限参数,因其文件系统(NTFS/FAT)无Unix式rwx八进制权限模型,而依赖ACL和SID;底层调用CreateDirectory() API不接受mode参数,故PHP主动丢弃该值,属设计兼容性行为,非bug。

PHP 的 mkdir() 函数在 Windows 下忽略权限参数(如 0755 或 0644),根本原因在于 Windows 文件系统(NTFS/FAT/exFAT)的权限模型与 Unix/Linux 完全不同——它不使用“rwx”三位八进制位来控制访问,而是依赖 ACL(访问控制列表)和用户/组安全标识符(SID)。
Windows 没有“文件模式位”概念
Unix 类系统中,每个文件或目录都有明确的 mode 位(如 0755 → rwxr-xr-x),内核直接据此判断读、写、执行权限。而 Windows 的权限由 ACL 动态管理,例如“Users 组可写”、“Administrators 完全控制”,这些无法用一个三位八进制数表达。PHP 的 mkdir() 底层调用的是 Windows API(如 CreateDirectory()),该 API 不接受 mode 参数,因此 PHP 主动丢弃了传入的 $mode 值,不报错也不生效。
PHP 手册明确说明此行为
官方文档清楚指出:“mode 在 Windows 下被忽略”。这不是 bug,而是设计兼容性决策。即使你写 mkdir('test', 0777, true) 或 mkdir('test', 0000, true),创建出的目录在资源管理器中看到的属性仍取决于当前用户权限、父目录继承策略及系统默认安全模板,与传入的数字完全无关。
实际影响与注意事项
- 代码跨平台时无需为 Windows 单独处理权限逻辑,但也不能指望它起作用
- 若需在 Windows 上控制访问(如限制 Web 用户写入),应通过系统级手段:设置 NTFS 权限、配置 IIS/Apache 运行用户、或使用
cacls/icacls命令行工具 - 不要因 Windows 下权限无效就省略
0前缀(如写成755)——这在 Linux 环境会引发严重错误(被当十进制解析),保持0755写法是正确且安全的跨平台习惯



















