Composer config -g repo.packagist不生效的根本原因是漏掉三要素之一:-g参数、单数键名repo.packagist、type值composer,或URL末尾缺/;且宝塔中实际执行用户为www,需sudo -u www重配,并确保PHP未禁用putenv/proc_open等函数。

宝塔里 composer config -g repo.packagist 总不生效
根本原因不是镜像地址写错,而是命令漏了三要素中的任意一个,Composer 就静默 fallback 到官方源,不报错、不提示,composer install 还是卡在 Loading composer repositories...。
必须一次性写全:
-
-g:全局配置,不加就只改当前目录下的composer.json -
repo.packagist:键名严格为单数repo,写成repos.packagist或repositories.packagist全部无效 -
composer:这是 type 值,不是可选参数;省略它,Composer 2.0+ 会自动回退到https://packagist.org -
https://mirrors.aliyun.com/composer/:必须 HTTPS,且末尾/不能少;少一个斜杠,请求路径变成/composerpackages.json,直接 404
验证是否真写进去了:composer config -g repo.packagist,输出必须是类似 {"type": "composer", "url": "https://mirrors.aliyun.com/composer/"}。空、null、或只返回 {"url": "https://packagist.org"} 都说明没配对。
宝塔终端执行用户不是 root,而是 www
你在终端用 root 跑了 composer config -g,配置只写进了 /root/.composer/config.json;但宝塔「一键部署」或 PHP 管理器里触发的 composer install,99% 是以 www 用户身份运行的,它根本读不到 root 的配置文件。
确认方法:
- 在宝塔终端执行
whoami,看当前是谁 - 查计划任务日志或部署日志,找类似
UID=1001的字段,再用id -un 1001查对应用户名
正确重配方式:sudo -u www composer config -g repo.packagist composer https://mirrors.aliyun.com/composer/。注意:必须带 sudo -u www,否则又白配。
PHP 禁用函数没放开,镜像再快也卡死
即使镜像 URL 正确、用户也对了,composer install 还是卡住或报 putenv() has been disabled,就是宝塔 PHP 管理里禁用了关键函数。
必须进入宝塔「软件商店 → 对应 PHP 版本 → 设置 → 禁用函数」,手动删掉以下三项:
putenvproc_openpcntl_signal
删完点「保存」,再「重载配置」——不重载,PHP CLI 进程不会重新加载 ini 设置,禁用函数依然生效。
项目目录下有 repositories 字段,全局镜像直接失效
只要 composer.json 根对象里存在 "repositories" 字段(哪怕只是空对象 {}),Composer 就完全忽略全局镜像配置,强制走你项目里定义的源。
检查方法:grep -A5 -B5 repositories composer.json
临时解决(仅限调试):composer install --no-plugins --no-scripts,但治标不治本。真正要长期用镜像,得删掉或注释掉项目里的 repositories 块,让全局配置接管。
复杂点在于:有些框架脚手架(比如 Laravel 官方安装器)会默认写入 repositories,你 clone 下来第一件事就得先清理它,否则所有镜像配置都白搭。


















