必须用/etc/composer/config.json才真正批量生效,因宝塔PHP进程以www用户运行,读不到root的~/.composer/config.json;该系统级配置优先级最高,所有用户均可读,且需同步解除putenv等禁用函数并重载PHP配置。

不能靠“全局配置”一劳永逸,必须用 /etc/composer/config.json 才算真正批量生效。 宝塔里执行 composer config -g 只改 /root/.composer/config.json,而绝大多数 PHP 网站是以 www-data 或 www 用户运行的,根本读不到 root 的配置。
为什么 composer config -g 在宝塔批量场景下基本失效
宝塔面板中站点 PHP 进程默认以低权限用户(如 www)运行,但 composer config -g 命令默认写入的是当前登录用户(通常是 root)的 ~/.composer/config.json。结果就是:你在终端里 composer config -g repo.packagist 显示成功,但网站后台执行 composer install 依然卡在 Loading composer repositories...。
-
composer config -g写的是/root/.composer/config.json,对www用户完全不可见 - 即使手动
sudo -u www composer config -g,也常因www用户无 shell、HOME不可写或~/.composer目录未初始化而失败 - 宝塔 PHP 管理界面里禁用函数的设置是按版本独立的,但
composer config -g不解决函数被禁问题——镜像再快,proc_open()被禁也是白搭
真批量:直接写 /etc/composer/config.json
Composer 2.2+ 支持系统级配置路径 /etc/composer/config.json,它优先级最高、不依赖任何用户 home 目录,且所有用户(包括 www)都会加载。这才是宝塔多站点环境下的唯一可靠方案。
Linux AI 服务器 — 将 Linux 服务器转换为本地 AI 推理集群。使用 systemd、NVIDIA CUDA 实现无头 Linux AI,零 GUI 开销。
- 先确保目录存在:
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应输出https://mirrors.aliyun.com/composer/
必须同步清理 PHP 禁用函数
镜像地址配对了,但 putenv、proc_open、pcntl_signal 还在宝塔 PHP 管理的禁用列表里?那 composer install 仍会报 Call to undefined function putenv() 或直接卡死。
- 进宝塔【网站】→【PHP 管理】→ 选中你所有站点共用的 PHP 版本(比如
82)→【禁用函数】 - 手动删除这三行(不是取消勾选,是整行删掉):
putenv、proc_open、pcntl_signal - 点【重载配置】——这是关键一步,不点就等于没改
- 验证:
sudo -u www php -r "echo putenv('TEST=1');"和sudo -u www php -r "var_dump(proc_open('echo 1', [], $pipes));"都不能报错
验证是否真的走镜像,别信“命令没报错”
很多人配完就以为搞定了,结果上线后还是慢。最准的验证方式是看 Composer 实际请求日志。
- 进任一站点根目录,执行:
sudo -u www /www/server/php/82/bin/php /usr/local/bin/composer update -vvv 2>&1 | grep 'GET ' - 正常应看到类似:
GET https://mirrors.aliyun.com/composer/packages.json - 如果出现
GET https://repo.packagist.org/packages.json,说明镜像没生效,回头检查/etc/composer/config.json格式或 PHP 禁用函数 - 若提示
Could not fetch packages.json,大概率是 PHP 禁用了curl或openssl扩展,需回宝塔 PHP 管理里确认已启用
最易被忽略的点是:镜像源 URL 必须以 / 结尾,且 type 字段必须显式写 "composer";/etc/composer/config.json 的 JSON 格式必须严格合法(比如对象末尾不能有逗号);还有,改完 PHP 禁用函数后不点【重载配置】,等于白改。

















