Composer install 报 extension 或 ini 缺失实为 CLI 环境配置问题,需确认 php --ini 路径、php -m 验证扩展,并用 config.platform 声明目标平台约束以绕过解析检查。

Composer install 时提示 extension 或 ini 设置缺失,实际已启用?
Composer 本身不主动校验 PHP ini 配置,但某些包(如 ext-gd、ext-opcache、memory_limit=256M)会在 composer.json 的 require 或 config.platform 中声明环境约束。真正触发报错的是 Composer 内部调用的 extension_loaded() 和 ini_get() —— 它读的是当前 CLI 环境下 php -i 所用的配置,不是 Web 服务器用的 php.ini。
- 运行
which php和php --ini确认 CLI 使用的php.ini路径,不是 Apache/Nginx 的 - 常见陷阱:Docker 中 PHP CLI 和 FPM 使用不同
php.ini;Mac M1 上通过 Homebrew 安装的 PHP,CLI 可能加载了/opt/homebrew/etc/php/8.3/php.ini,而 GUI 工具用的是另一份 - 执行
php -m | grep gd比看phpinfo()更可靠,因为 CLI 和 Web SAPI 加载扩展可能不同
如何让 Composer 跳过某项 ini 检查?
不能“跳过”,但可以“绕过”——本质是让 Composer 认为该条件已满足。最安全的方式是用 config.platform 告诉它“目标环境有这个配置”,适用于部署时无法修改生产环境 ini 的场景(如共享主机):
{
"config": {
"platform": {
"php": "8.2.10",
"ext-gd": "1",
"ext-mbstring": "1",
"ext-zip": "1",
"memory_limit": "512M"
}
}
}
注意:config.platform 不会改变实际运行时行为,只是影响依赖解析。如果运行时真的缺 ext-gd,应用仍会报错,只是 Composer 允许你装上它。
-
memory_limit这类 ini 值必须写成字符串,如"256M",不能写256M(JSON 解析失败) -
ext-xxx的值写"1"即可,Composer 只检查是否非空 - 不要滥用:本地开发应真实配置好环境,
platform仅用于 CI/CD 或受限部署环境
vendor/bin/xxx 命令启动失败,报 “Class not found” 或 “undefined function”?
这往往不是 Composer 安装问题,而是依赖的二进制脚本(如 phpunit、larastan)在运行时动态检查扩展或 ini 设置,而它们继承的是当前 shell 的 PHP 配置。例如 phpunit 启动时检测 opcache.enable_cli=1,但你的 CLI php.ini 里关掉了它。
立即学习“PHP免费学习笔记(深入)”;
- 用
php -d opcache.enable_cli=1 vendor/bin/phpunit临时覆盖设置 - 更持久的做法:在项目根目录加
php.ini,然后用php --php-ini ./php.ini vendor/bin/phpunit - 检查脚本头部的
#!/usr/bin/env php—— 它调用的是默认php,不会读取项目级配置 - 某些工具(如
psysh)会明确提示缺失的 ini 项,直接按提示补上即可
CI 环境中反复遇到 “Your requirements could not be resolved”?
这不是依赖冲突,而是 Composer 在解析阶段就拒绝继续,因为平台约束不满足。典型日志如:The requested PHP extension ext-gd * is missing from your system.。此时重点不是改 composer.json,而是确保 CI runner 的 PHP 环境完整:
- GitHub Actions:用
shivammathur/setup-php动作,显式开启扩展:extensions: gd, mbstring, zip - GitLab CI:在
.gitlab-ci.yml中用apt-get install php8.2-gd(Debian/Ubuntu)或apk add php82-gd(Alpine) - 自建 runner:确认
php -m输出包含所需扩展,且php -r "echo ini_get('memory_limit');"返回合理值 - 避免在
before_script里用phpenmod—— 它只对 Apache 有效,CLI 无响应
最常被忽略的一点:PHP CLI 的 disable_functions 会拦截 extension_loaded,导致 Composer 认为扩展不存在,即使 php -m 显示已加载。检查 php -i | grep disable_functions。











