根本原因是当前用户对目标目录无写权限,需用chown -r $user:www-data ./修复所有权,而非chmod 777或sudo强行执行。

直接结论:不是命令写错了,是当前用户没权限操作目标目录或运行时环境。 ThinkPHP5 安装过程中的 mkdir(): Permission denied、require(): Failed opening required 或执行 php think run 报 Permission denied,90% 以上都源于 Linux/macOS 下的文件所有者/权限不匹配,或 Windows 下未以管理员身份运行终端 —— 不要急着改代码,先看权限链。
composer require topthink/thinkphp 报 mkdir() Permission denied
这是 Composer 尝试在项目目录下创建 vendor/ 或框架自动初始化的 runtime/ 时被系统拒绝。根本原因是:当前 shell 用户对目标路径(比如 ./ 或 ./runtime)没有写权限。
- 先确认当前路径归属:
ls -ld .和ls -ld runtime,看 owner 是不是你当前登录的用户名 - 如果 owner 是
root或www(常见于宝塔、LNMP),但你是普通用户(如admin),就不能直接写 —— 切换sudo不是解法,它会让vendor/归属变成 root,后续 Web 服务器(nginx/apache)反而读不了 - 正确做法是把目录所有权还给当前用户:
sudo chown -R $USER:www-data ./(Ubuntu/Debian)或sudo chown -R $USER:nginx ./(CentOS/RHEL),再重试composer require - 避免用
chmod -R 777 ./—— 这会开放所有文件可写,Web 服务器一旦被入侵,攻击者可直接改 PHP 文件
php think run 启动失败,提示 Permission denied
这个错误通常不是 PHP 脚本本身没权限,而是 think 命令文件缺少可执行位,或当前用户无法绑定端口(默认 8000)。
- 检查
think文件权限:ls -l think,如果没x(如显示-rw-r--r--),运行chmod +x think - 若报错含
Address already in use或Permission denied (Bind),说明端口被占或低于 1024 的端口需要 root —— 改用高编号端口:php think run -p 8080 - Windows 用户必须以「管理员身份运行」PowerShell 或 CMD,否则即使端口 >1024,也可能因 UAC 拦截导致 socket 创建失败
- Mac/Linux 下如果用了
sudo php think run,生成的runtime/目录会归 root 所有,后续 Web 请求(由 www-data/nginx 用户发起)将无法写日志或缓存 —— 启动后立刻执行sudo chown -R $USER:www-data runtime/
宝塔面板里访问 public/index.php 提示 require(): Failed opening required '.../base.php'
表面是文件找不到,实际多为权限或路径映射问题。宝塔默认把网站根目录设为 public/,但框架仍需向上跳级读取 thinkphp/ 目录 —— 如果该目录不可读,就会爆这个错。
- 进宝塔「文件」管理,定位到项目根目录(即
public的同级),右键点击thinkphp文件夹 → 「权限」→ 确保「所有者」是www,「权限数字」至少为755(目录)和644(文件) - 检查伪静态规则是否生效:宝塔站点设置 → 「网站目录」→ 确认「运行目录」选的是
/public;再进「伪静态」→ 选「ThinkPHP5」模板(不是 Laravel 或其他) - 如果用的是 Git 克隆项目,确认
thinkphp/目录真实存在 —— TP5 不再把核心打包进主仓库,git clone后需手动composer install或下载完整版 ZIP - 极少数情况是 open_basedir 限制:宝塔 PHP 设置 → 「配置修改」→ 找到
open_basedir,把项目绝对路径加进去,例如:/www/wwwroot/your-site/:/tmp/:/proc/
最常被忽略的一点:权限问题从来不是孤立的。改完 chown 必须同步检查 Web 服务器用户(www-data、nginx、www)能否读取 runtime/ 和 public/,能否写入 runtime/log/ 和 runtime/cache/ —— 少一个环节,后面就卡在 500 错误里查半天日志。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











