宝塔中 composer install 报错主因是 PHP 环境配置不匹配:需同时检查并修改 php.ini 与 php-cli.ini 的 disable_functions(放开 proc_open、putenv、pcntl_signal),以 www 用户执行配置并重启 PHP,再验证证书路径与系统时间。

宝塔里 composer install 报错,90% 不是代码或网络问题,而是 PHP 环境没对上——执行用户、禁用函数、证书路径、配置作用域这四点错一个就卡死。
为什么 composer install 在宝塔里报 Call to undefined function proc_open() 或 putenv()
这不是 Composer 脚本写错了,是 PHP CLI 模式下关键函数被禁用。宝塔默认在 php.ini 和 php-cli.ini 里禁了 proc_open、putenv、pcntl_signal,而 Composer 启动阶段必须调用它们。
- 先验证:运行
php -r "var_dump(function_exists('proc_open'));",输出bool(false)就确认被禁 - 必须同时检查两个配置文件:
/www/server/php/{版本}/etc/php.ini(FPM 模式)和/www/server/php/{版本}/etc/php-cli.ini(命令行模式),删掉disable_functions行里的proc_open、putenv、pcntl_signal - 改完一定要重启 PHP 服务(不是重载),CLI 模式还要新开终端或执行
source ~/.bashrc - 验证是否生效:
php -r "echo proc_open('echo 1', [], $p) ? 'ok' : 'fail';"输出ok才算真通
镜像配了但 composer install 还走 packagist.org
composer config -g repo.packagist composer https://mirrors.aliyun.com/composer/ 看似成功,其实可能完全没生效——Composer 2.5+ 已静默废弃该配置项,不报错也不提示。
- 项目级更可靠:进项目根目录,运行
composer config repo.packagist composer https://mirrors.aliyun.com/composer/(不加-g),它会自动写进composer.json的repositories字段 - 如果
composer.json原来是"repositories": [],得先手动改成"repositories": {}再执行,否则报错 - 全局级替代方案:设环境变量
COMPOSER_REPO_PACKAGIST=https://mirrors.aliyun.com/composer/,加到/etc/profile或~/.bashrc,再source - 验证是否真生效:
composer install -vvv | grep "Downloading.*packages.json",看请求域名是不是mirrors.aliyun.com
执行用户是 www,但你用 root 配的镜像
宝塔「一键部署」或网站设置里点「Composer 执行安装」,实际是以 www 用户身份运行的,不是 root。你在终端用 root 执行的 composer config -g,只写进了 /root/.composer/config.json,www 根本读不到。
- 查当前执行用户:在宝塔终端执行
whoami,或查部署日志里UID=xxx,再用id -un xxx确认用户名 - 切用户重配:
sudo -u www composer config -g repo.packagist composer https://mirrors.aliyun.com/composer/ - 注意三要素不能少:
-g、键名严格为repo.packagist、type必须显式写composer、URL 必须 HTTPS 且末尾带/ - 验证:
sudo -u www composer config -g repo.packagist应输出完整 JSON:{"type": "composer", "url": "https://mirrors.aliyun.com/composer/"}
composer install 卡在 Loading composer repositories 或报 SSL 错误
换源只加速下载,不解决底层 HTTPS 握手失败。常见原因是 CA 证书过期或系统时间偏差太大(>5 分钟)。
- 查证书路径:
php -r "print_r(openssl_get_cert_locations());",重点看default_cert_file - 如果路径为空或文件不存在(比如指向已停更的
/etc/ssl/certs/ca-bundle.crt),手动补证书:curl -sS https://curl.se/ca/cacert.pem -o /usr/local/etc/openssl/cert.pem,再在php.ini加openssl.cafile=/usr/local/etc/openssl/cert.pem - 检查系统时间:
date,CentOS 执行sudo ntpdate -s time.nist.gov,Ubuntu 用sudo timedatectl set-ntp true - 别忽略缓存污染:运行
composer clear-cache再试,尤其之前失败过多次
最常被忽略的是 php-cli.ini 和 www 用户权限这两层——它们不在同一个配置路径,也不共享环境变量,单独修一个根本没用。


















