permission denied主因是文件或目录缺少执行权限(x位),如vendor/bin/脚本目标文件无x位,或父目录不可遍历;需用chmod +x修复具体文件,或chmod 755修复目录,而非盲目chmod -r。

依赖包里 vendor/bin/ 脚本执行报 Permission denied
这不是包本身的问题,而是 Composer 生成的可执行文件(如 phpunit、laravel)被系统拒绝执行。Linux/macOS 下,vendor/bin/ 里的脚本是符号链接或 shell wrapper,但目标文件(比如 vendor/phpunit/phpunit/phpunit)若权限位缺失 x(执行),就会触发 “Permission denied”。
- 先确认问题路径:错误信息通常带具体文件,例如
bash: vendor/bin/phpunit: Permission denied - 检查目标文件权限:
ls -l vendor/phpunit/phpunit/phpunit—— 若没有-rwxr-xr-x中的x,说明它没被设为可执行 - 手动修复:
chmod +x vendor/phpunit/phpunit/phpunit(不加-R,只修这个文件) - 根本原因:某些共享主机或 CI 环境 umask 设置为
0027或0077,导致 Composer 解压时跳过执行位;不是所有包都声明了bin的可执行属性
vendor/ 里某个包的 config/ 或 resources/ 目录读不了
典型现象是运行时抛出 file_get_contents(/path/to/vendor/acme/tool/config/settings.php): failed to open stream: Permission denied。这说明 PHP 进程(CLI 或 Web)能进入 vendor/,但卡在子目录某层。
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
- 不要直接
chmod -R 755 vendor/:多数包的资源文件本就不该可执行,且会破坏 Git 权限记录 - 定位真正出问题的包:
ls -ld vendor/acme/tool/config—— 如果显示drw-r--r--(无x),则目录不可遍历,PHP 无法进入子目录读文件 - 最小修复:
chmod 755 vendor/acme/tool/config(仅该目录,不递归) - 注意:Web 服务器用户(如
www-data)必须对整个路径有x权限才能 traverse,所以哪怕只是读一个 PHP 文件,父目录也得有执行位
Laravel/Symfony 类框架中 vendor 包的 views/ 或 translations/ 加载失败
比如 View [vendor.package::welcome] not found 或翻译文件 messages.php 读取为空,背后常是权限链断裂:Web 进程能打开 vendor/package/resources/lang/en/messages.php,但上层 lang/ 或 resources/ 目录缺少 x 权限。
- 用 Web 用户身份验证:
sudo -u www-data ls -l vendor/package/resources/lang/en/(把www-data换成你实际的 Web 用户) - 如果报 “Permission denied” 在
lang/目录,说明它或resources/缺少x—— 修复命令:chmod 755 vendor/package/resources vendor/package/resources/lang - 别碰
vendor/根目录的权限:它只需r-x(即755),Web 服务从不往里写,但必须能遍历 - CI 部署时建议加一句:
find vendor -type d -exec chmod 755 {} \;,只补目录执行位,不影响文件内容权限
为什么 chmod 644 一个 PHP 配置文件还会 Permission denied
因为权限检查是路径级的:即使 config.php 本身是 -rw-r--r--(644),只要它的父目录 config/ 是 drw-r--r--(644),PHP 就无法 opendir() 或 stat() 它 —— open 系统调用需要路径上每个环节都有 x(对目录而言是“可遍历”)。
- 快速诊断:逐级
ls -ld vendor/package/{config,config/config.php},看哪一级开始丢x - 修复顺序:先
chmod 755 vendor/package/config,再确认config.php是644即可 - Windows 下一般不出现此问题(NTFS 权限模型不同),但 WSL2 或 Docker 容器内运行 Linux 镜像时,会完全复现该行为
- 最隐蔽的坑:某些 Composer 插件(如
hirak/prestissimo旧版)在并行下载时可能跳过设置目录执行位,升级到composer v2.7+可缓解
messages.php 还报错,是因为没意识到 lang/ 目录本身挡在前面。










