宝塔中composer install卡住,首要检查执行用户是否为www而非root;需用sudo -u www composer config -g repo.packagist composer https://mirrors.aliyun.com/composer/重配,并确保禁用函数putenv/proc_open/pcntl_signal已删除、URL末尾带斜杠、键名严格为repo.packagist。

执行用户不是 www,全局镜像配置白写了
宝塔里点「Composer 执行安装」,实际是 www 用户在跑,不是 root。你用 root 执行了 composer config -g repo.packagist composer https://mirrors.aliyun.com/composer/,配置只写进了 /root/.composer/config.json,www 根本读不到。
验证当前执行用户:whoami 或查部署日志里的 UID=xxx,再用 id -un xxx 确认用户名。
正确重配命令(三要素缺一不可):
-
-g:必须加,否则只改当前项目目录 -
repo.packagist:键名严格为单数repo,不是repos或repositories.packagist -
composer:type 值,不能省略;URL 必须 HTTPS 且末尾带/,少斜杠会 404
执行:sudo -u www composer config -g repo.packagist composer https://mirrors.aliyun.com/composer/
验证是否生效:sudo -u www composer config -g repo.packagist,输出应为 {"type": "composer", "url": "https://mirrors.aliyun.com/composer/"}
PHP 禁用函数没放开,镜像再快也卡住
即使镜像 URL 正确、用户也对了,composer install 还卡在 Loading composer repositories,大概率是 PHP 禁用了关键函数。
常见被禁用且必开的函数:
-
putenv:报错putenv() has been disabled for security reasons -
proc_open:报错The Process class relies on proc_open或TypeError: Return value of Symfony\Component\Process\Process::close -
pcntl_signal、shell_exec:部分插件或 xdebug-handler 依赖
操作路径:宝塔 → 软件商店 → 已安装 → PHP → 设置 → 禁用函数 → 删除对应函数名
注意:php.ini 和 php-cli.ini 是两套配置,composer install 走的是 CLI 模式,必须改 php-cli.ini(通常在 /www/server/php/{版本号}/etc/php-cli.ini),改完重启 PHP 服务
PHP 扩展缺失但已安装,其实是 CLI 版本没对上
报错 ext-fileinfo * -> it is missing from your system 或 ext-zip,但你在宝塔软件商店里明明点了安装——问题常出在 PHP CLI 使用的不是你认为的那个版本。
检查真实 CLI 版本:/www/server/php/83/bin/php -m | grep -E "(fileinfo|zip)"(把 83 换成你实际用的版本号)
常见原因:
- 宝塔网站设置里选的 PHP 版本 ≠ CLI 实际调用的版本
- 系统存在多个 PHP 版本,
php命令 alias 指向了旧版或未启用扩展的版本 - fileinfo 在编译时被
--disable-fileinfo排除(尤其低配机器默认行为)
安全做法:不依赖 php 别名,显式用绝对路径调用:/www/server/php/83/bin/php /usr/bin/composer install --working-dir=/www/wwwroot/xxx
Composer 命令本身找不到,环境变量没生效
终端里输入 composer --version 报 command not found,不是宝塔问题,是系统 PATH 没导出 Composer 可执行文件。
宝塔终端默认不加载 ~/.bashrc,所以即使你用 mv composer.phar /usr/local/bin/composer 安装了,它也不在 PATH 里。
解决方法:
- 确认 Composer 是否真已安装:
which composer,没输出就先装 - 如果已装但路径不在 PATH,临时加:
export PATH="/usr/local/bin:$PATH"(仅当前会话有效) - 永久生效:编辑
/root/.bashrc,末尾加export PATH="/usr/local/bin:$PATH",再source /root/.bashrc
但注意:PHP 脚本里用 shell_exec('composer ...') 仍可能失败——因为 PHP CLI 不读 shell 的 .bashrc。更稳妥的方式是,在代码里直接调用绝对路径:/usr/local/bin/composer install
最易被忽略的点:同一个 PHP 版本下,php.ini 控制 FPM(网页请求),php-cli.ini 控制命令行;禁用函数、扩展开关、甚至 disable_functions 的拼写空格,都得分别检查两处。漏掉任一,composer install 就会在不同环节静默失败。


















