宝塔里composer config -g不生效是因为写入/root/.composer/config.json,而php进程以www用户运行,读不到root配置;真正批量生效需写/etc/composer/config.json并清空php禁用函数putenv、proc_open、pcntl_signal。

宝塔里执行 composer config -g 为什么总不生效?
因为这条命令默认写进 /root/.composer/config.json,而宝塔所有网站 PHP 进程都以 www 用户运行,根本读不到 root 的配置文件。你终端里执行成功了,但网站后台跑 composer install 时照样卡在 Loading composer repositories...。
常见错误现象:Call to undefined function putenv()、proc_open(): fork failed、repo.packagist 查出来是空或 null。
-
repo.packagist拼错(比如写成repos.packagist或packagist.org) - 漏掉中间的
composer类型参数,导致 fallback 到官方源 - URL 少了末尾
/,请求变成https://mirrors.aliyun.com/composerpackages.json直接 404
真正批量生效的唯一路径:写 /etc/composer/config.json
Composer 2.2+ 支持系统级配置,/etc/composer/config.json 优先级最高,所有用户(包括 www)都会加载,且不依赖任何 HOME 目录。
操作步骤:
- 确保目录存在:
sudo mkdir -p /etc/composer - 写入标准 JSON(注意结尾不能有多余逗号):
{ "config": {}, "repositories": { "packagist.org": { "type":"composer", "url":"https://mirrors.aliyun.com/composer/" } } } - 设权限:
sudo chmod 644 /etc/composer/config.json && sudo chown root:root /etc/composer/config.json - 验证是否被
www用户识别:sudo -u www composer config repo.packagist应输出镜像 URL
禁用函数没清干净,镜像再快也没用
即使 /etc/composer/config.json 配对了,如果 putenv、proc_open、pcntl_signal 还在宝塔 PHP 管理的禁用列表里,composer install 依然会报错或卡死。
必须进宝塔【网站】→【PHP 管理】→ 选中你所有站点共用的 PHP 版本 →【禁用函数】→ 手动删除这三项文字(不是取消勾选),然后点【重载配置】。
别信“只删一个就行”——三个都得清,少一个就可能在不同阶段崩溃。
项目级配置比全局更稳,尤其适合上线部署
团队协作或 CI 环境里,全局配置容易因用户权限错位失效。直接改项目 composer.json 更可靠:
- 进项目根目录,运行:
composer config repo.packagist composer https://mirrors.aliyun.com/composer/(去掉-g) - 它会自动往
composer.json顶层写"repositories"字段,不会覆盖已有私有源 - 如果项目已有
"repositories": {"packagist.org": false},得先删掉该字段,再执行composer clear-cache -
composer.lock文件里的 dist URL 是缓存旧地址,必须执行composer update --lock强制刷新,否则仍会尝试原始源
最常被忽略的是 composer.lock 里的下载链接没更新——配对了镜像,但 install 仍卡在 installing xxx (v1.2.3),问题不在镜像,而在 lock 文件。











