真正原因是共享主机web路径(如public_html)禁止写入,需将项目迁至用户主目录(如~/myapp/),并确保目录属主为当前用户且可写;若仍失败,检查磁盘配额或selinux状态。

共享主机上 vendor 目录写入失败的真正原因
不是 Composer 本身要 root,而是它默认尝试在项目根目录下创建 vendor/、composer.lock 和 autoload.php,而共享主机通常只开放用户主目录(如 ~/myapp/)可写,~/public_html/ 或 ~/www/ 这类 Web 可访问路径往往禁止写入 —— 尤其是 vendor/ 自动生成时会触发权限拒绝。
- 先确认当前项目路径:运行
pwd,如果输出含public_html、www或htdocs,立刻迁移代码到~/myapp/类纯用户目录 - 迁移后,用
ls -ld .检查当前目录是否属你且可写(应显示drwxr-xr-x或类似,不含root) - 若仍报
file_put_contents(./vendor/autoload.php): Failed to open stream: Permission denied,大概率是磁盘配额已满或 SELinux 启用,先运行df -h ~和getenforce
auth.json 放错位置导致私有包拉取静默失败
私有 Git 仓库(如 GitLab、自建 Satis)配置了认证但始终走匿名下载,composer install 却不报错 —— 这是 auth.json 路径、字段名或域名 key 不匹配的典型表现,Composer 会直接跳过,不提示也不报错。
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
- Linux/macOS 必须放
~/.composer/auth.json,不是项目内、不是~/.config/composer/auth.json,且权限必须为600:chmod 600 ~/.composer/auth.json - 字段名只能是
http-basic,写成gitlab-token或oauth全无效 - 域名 key 必须和
repositories.url的 host 完全一致,包括端口:比如"https://git.example.com:8443"对应的 key 就得是"git.example.com:8443",少个端口就失效
umask 设置不当让新生成文件不可读
即使 composer install 成功,PHP 运行时却报 failed to open stream,常见于共享主机默认 umask 是 0002 或更松,导致生成的 PHP 文件变成 664(组可写),而 Web 服务器(如 suPHP、PHP-FPM with different user)因安全策略拒绝加载组可写的脚本。
- 安装前临时收紧:
umask 0022,确保新建文件为644、目录为755 - 在
~/.bashrc或部署脚本开头加umask 0022,避免每次手动输 - CI/CD 环境中禁用
sudo composer install,改用非特权用户 + 固定 umask
vendor 权限加固不能靠 chmod -R 775
很多教程教 chmod -R 775 vendor/,这是危险操作:组内任意成员都能改 vendor/autoload.php 或注入恶意 bin 脚本。真实生产环境必须区分文件与目录、普通文件与可执行脚本。
- 安装完成后立即执行:
find vendor/ -type f -exec chmod 644 {} \; - 再设目录权限:
find vendor/ -type d -exec chmod 755 {} \; -
vendor/bin/下脚本需可执行但不可写:chmod 755 vendor/bin/* - 若 Web 用户(如
www-data)和部署用户不同,把 Web 用户加进部署用户组,再跑chmod -R g+rX vendor/,而非放宽所有者权限
vendor/ 下某些包的 post-install-cmd 脚本可能绕过你设的 umask 创建可写 symlink —— 所以权限加固必须是 install 后的强制步骤,不能省。










