核心问题是PHP进程用户对目标路径无写权限或父目录缺x执行权限;需检查父目录存在性及w/x权限、确认PHP运行用户并chown授权、递归创建须加true参数、注意0755八进制写法及Docker/macOS等特殊环境限制。

PHP 执行 mkdir() 报 Permission denied,核心问题不是代码写错了,而是当前 PHP 进程运行用户对目标路径**没有写入权限**,或**缺少进入父目录的执行权限(x)**。解决需从路径、用户、权限三方面入手。
检查并确保父目录存在且可写
mkdir 默认不递归创建,比如要建 /a/b/c,但 /a/b 不存在,就会直接报错(No such file or directory 或 Permission denied)。别只盯着目标目录,先确认每一级父目录都存在,并且 PHP 进程用户对它有 w(写)和 x(执行)权限:
- 用
is_writable('/a/b')提前判断,比靠报错更可靠 - 需要递归建多级目录时,必须加第三个参数:
mkdir('/a/b/c', 0755, true) - 注意:权限值必须写成
0755(开头带 0),写成755是十进制,实际权限会错乱
确认 PHP 实际运行用户并授权
Web 服务器(如 Apache、Nginx、PHP-FPM)以特定系统用户身份运行 PHP 脚本,常见为 www-data(Ubuntu/Debian)、www(CentOS/宝塔)、_www(macOS)等。这个用户才是真正的“操作者”:
- 查用户:运行
ps aux | grep -E '(apache|nginx|php-fpm)'或看配置文件(如 Nginx 的user指令) - 改属主:把目标目录及父目录属主设为该用户,例如
chown -R www:www /var/www/html/runtime - 补权限:确保该用户组有写权限,例如
chmod -R g+rw /var/www/html/runtime
留意特殊环境限制
常规 chmod/chown 在某些场景下仍无效,需排查更深层原因:
-
Docker:COPY 进容器的文件默认属主是 root,需在 Dockerfile 中加
RUN chown -R www-data:www-data /var/www/html -
macOS + XAMPP:XAMPP 应用本身权限受限,需右键 → “显示简介” → “共享与权限” → 将
everyone设为“读与写”,并点“应用到包含的项目” -
挂载卷(NAS/NTFS/FAT):若路径指向挂载设备(如
/nas/app),挂载时未设umask=002或dmask=002,会导致符号链接下权限被拦截 -
SELinux 或安全模块:CentOS/RHEL 上可能被 SELinux 策略阻止,临时测试可用
setenforce 0,长期方案需调整上下文(chcon)
快速验证与避坑提示
别一上来就 chmod 777 —— 安全风险高,且常治标不治本:
- 先用
namei -l /your/target/path查每一级目录的实际权限和属主,定位哪一层卡住 - 检查是否启用了
open_basedir,它会直接禁止访问指定范围外的路径 - 如果报错里含
Disk quota exceeded,说明是磁盘配额满,不是权限问题,运行quota -u www确认 - ThinkPHP、Laravel 等框架的
runtime、storage目录是高频出错点,优先检查它们的属主和父目录 x 权限
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











