必须绕开系统限制才能在共享主机安装Composer,因其默认操作涉及不可写的全局路径;需将Composer、缓存、依赖全部收敛至用户可写目录(如~/bin、~/myapp),并配置私有缓存、自定义home路径及Web映射。

在共享主机(虚拟主机)上装 Composer,不是“能不能装”的问题,而是“必须绕开系统限制”——它默认要写全局缓存、生成 bin 脚本、甚至尝试改 /usr 下路径,而共享主机只给你一个可写的用户家目录(比如 ~/myapp/),public_html 目录通常连 vendor/ 写入权限都没有。
为什么直接运行 curl -sS https://getcomposer.org/installer | php 会失败
共享主机报 permission denied,90% 是因为 Composer 在安装过程中试图:往 ~/.composer/vendor/bin 写可执行文件(被禁止)、往项目根目录写 vendor/(但 web 目录不可写)、或读取/创建系统级缓存(/tmp 可能受限或被隔离)。
- 先确认你有 SSH 访问权限和 shell(不是纯 FTP + 控制面板);没 shell 的“伪虚拟主机”,Composer 基本不可用
- 运行
pwd && ls -ld . ~ ~/myapp,确认~/myapp/这类非 web 目录是可写且可执行的 - 别在
~/public_html/或~/www/里直接跑composer install——它大概率卡在“Creating directory vendor/composer”这一步
真正可行的安装流程:全路径收敛到用户目录
核心思路:把 Composer 自身、缓存、项目依赖全部收束进你唯一可控的目录(比如 ~/bin 和 ~/myapp),不碰任何系统路径。
- 下载 PHAR 到可写目录:
curl -sS https://getcomposer.org/installer | php -- --filename=composer --install-dir=~/bin - 确保
~/bin在$PATH中:在~/.bashrc末尾加export PATH="$HOME/bin:$PATH",然后source ~/.bashrc - 设置私有缓存路径(防/tmp被清空或拒绝):
composer config -g cache-dir ~/composer-cache - 项目代码放
~/myapp,cd ~/myapp && composer install --no-dev --optimize-autoloader
部署时 vendor 不在 web 目录?用符号链接或 Web 服务器 alias
Laravel/ThinkPHP 等框架要求 public/ 是 Web 入口,但 vendor/ 必须可被 PHP require。如果 vendor/ 在 ~/myapp/vendor,而 Web 根目录是 ~/public_html,就不能硬拷贝——得靠映射。
- 推荐做法:在
~/public_html下建软链:ln -sf ~/myapp/public/* ./ && ln -sf ~/myapp/vendor ./(部分主机禁用 symlinks,需先确认) - 更稳方案:用 Apache 的
Alias或 Nginx 的alias指令,把/vendor请求指向~/myapp/vendor(需主机支持自定义配置) - 绝对不要用
cp -r vendor/ ~/public_html/vendor—— 后续composer update会失效,且权限/符号链接易出错
最关键的细节常被忽略:Composer 安装后第一次运行会生成 ~/.composer/auth.json,如果该文件被创建在不可写路径(比如只读的 NFS home),整个流程就会静默失败。务必在执行前用 composer config -g home ~/composer-home 把所有用户级配置挪到你可控的目录里——这个动作,比换镜像源重要十倍。










