Composer config -g在多用户环境失效,根本原因是配置仅写入当前用户HOME目录,而Web服务以www-data等无shell用户运行,读不到该配置;正确解法是使用Composer 2.2+支持的系统级配置/etc/composer/config.json,或为实际运行用户单独配置并确保权限正确。

为什么composer config -g在多用户环境下总失效
根本不是命令写错了,而是它默认只写当前 shell 用户的 ~/.composer/config.json。批量部署脚本或 Ansible 用 root 执行,配置就落进了 /root/.composer/config.json;而 PHP-FPM 或 Nginx 实际以 www-data、nginx 或应用专属用户运行,压根读不到 root 的配置。
更麻烦的是:目标用户可能没交互 shell(比如 www-data 的 /bin/false),sudo -u www-data composer config -g 会直接失败——Composer autoloader 加载不起来,连报错都看不到。
- 先确认用户是否存在且
HOME可写:getent passwd www-data | cut -d: -f6 - 若
~/.composer不存在,手动建目录并设权:sudo -u www-data mkdir -p /var/www/.composer && sudo chown www-data:www-data /var/www/.composer - 别用
sudo -i -u www-data—— 它加载完整 shell 环境,容易导致 CLI 和 web 使用不同php.ini,引发扩展缺失或路径错乱
/etc/composer/config.json 是唯一真全局方案
Composer 2.2+ 支持系统级配置,路径固定为 /etc/composer/config.json,优先级高于所有用户级配置,且不依赖任何用户 HOME 目录。这对多用户、Docker、Ansible 批量下发场景是刚需。
必须严格按以下步骤操作:
- 确保目录存在:
sudo mkdir -p /etc/composer - 写入 JSON(注意结尾不能有多余逗号):
{ "repositories": { "packagist.org": { "type": "composer", "url": "https://mirrors.aliyun.com/composer/" } } } - 权限必须是
644且属主root:sudo chmod 644 /etc/composer/config.json && sudo chown root:root /etc/composer/config.json - 验证是否生效:
sudo -u www-data composer config repo.packagist应输出镜像 URL;若为空,说明 Composer 版本低于 2.2,需升级
项目级 repositories 会完全覆盖全局镜像
哪怕你把 /etc/composer/config.json 配得再稳,只要项目根目录的 composer.json 里有 "repositories" 字段,全局配置就失效。这不是“合并”,而是“覆盖”。
Zynq‑7000 / Zynq UltraScale+ 硬件调试技能。适用于 Xilinx Zynq(Cortex‑A9/A53 + FPGA)Linux 环境,调试 I2C、I2S、UART、GPIO 等外设。包括设备树配置、内核驱动、用户空间调试工具、交叉编译和常见问题排查,支持 PetaLinux 开发。
常见陷阱:
-
"repositories": { "packagist.org": false }—— 直接禁用 packagist,镜像白配 -
"repositories": {}或空对象 —— 也会屏蔽全局源 - 手动编辑时漏掉引号、多加逗号,导致整个
composer.json解析失败,后续所有命令报错 - 快速检查:
grep -A5 '"repositories"' composer.json,留意是否存在硬编码源或false值
验证镜像是否真正走通,别信 config -g 输出
composer config -g repo.packagist 只告诉你“配置写进去了”,不等于“请求发出去了”。真正要看实际网络行为。
可靠验证方式:
- 清缓存:
composer clear-cache(旧缓存里存着 packagist.org 的元数据,不清就永远 fallback) - 触发真实请求:
composer require monolog/monolog -vvv - 观察日志中
Downloading行的域名:必须是https://mirrors.aliyun.com/composer/...,而不是packagist.org或repo.packagist.org - 如果看到
Could not fetch packages.json,先查 PHP 是否禁用了proc_open:sudo -u www-data php -i | grep disable_functions | grep proc_open,命中就得改对应php.ini
最易被忽略的一点:阿里云镜像 URL 末尾的斜杠 / 不能少,配成 https://mirrors.aliyun.com/composer(缺斜杠)会导致 404 或静默 fallback 到官方源。

















