composer diagnose 检查 json、mbstring、openssl、phar、filter、hash、zip、curl/openssl 等 composer 运行强依赖的扩展,不检查所有扩展;报错如 “the json extension is missing” 表示对应扩展未启用。

composer diagnose 会检查哪些 PHP 扩展
composer diagnose 默认会检查几个关键扩展是否启用,比如 json、mbstring、openssl、phar、filter、hash、zip(如果用到压缩包安装),还有 curl 或 openssl(用于 HTTPS 请求)。它不查所有扩展,只查 Composer 自身运行强依赖的那几个。
常见错误现象:composer diagnose 报 The json extension is missing 或 mbstring is required,说明对应扩展没开或没编译进 PHP。
- 确认扩展是否加载:运行
php -m | grep -E "json|mbstring|openssl|curl" - 检查 php.ini 路径:
php --ini,确保你改的是 CLI 模式下生效的配置(不是 Apache 或 FPM 的) - Windows 用户注意:
php.ini里扩展行不能带分号注释,且路径别用反斜杠写错,例如extension=php_openssl.dll要启用而非注释掉
composer install --dry-run 不验证扩展但会报运行时依赖失败
composer install --dry-run 只模拟安装流程,跳过实际写文件,但它仍会解析 composer.json 中的 require 和 require-dev,并触发对 PHP 版本、扩展、函数可用性的校验——只要某个包在 composer.json 的 require 里声明了 "ext-zip": "*",而当前 PHP 没开 zip,就会直接中断并报错。
使用场景:CI 流程中快速验证依赖是否可装,但又不想真下载/解压。这时候失败往往不是因为网络或权限,而是环境缺扩展。
立即学习“PHP免费学习笔记(深入)”;
- 错误信息典型格式:
ext-zip * is required but not installed或php >=8.1 is required but you are running 8.0.30 - 这种报错和
composer diagnose的检查逻辑不同:前者来自包元数据中的platform约束,后者是 Composer 自身硬依赖 - 临时绕过?别用
--ignore-platform-reqs掩盖问题,它只是跳过检查,不代表运行时不崩
怎么让 Composer 显式验证某扩展是否存在
没有单独命令只查一个扩展,但可以用 composer check-platform-reqs(Composer 2.2+)列出所有平台要求(PHP 版本 + 扩展 + 函数)及其满足状态。它比 diagnose 更贴近项目真实需求,因为读的是 composer.json 的 config.platform 和各包的 require。
参数差异:check-platform-reqs 默认只检查生产依赖;加 --with-dependencies 会递归检查所有依赖项的平台要求(包括 dev 包)。
- 示例输出中看到
ext-gd * missing就说明 GD 扩展没启用,哪怕diagnose没报它 - 如果你在
composer.json的config.platform里写了"ext-redis": "5.3.7",但本地是 5.3.6,这里就会标为unmet - 注意:这个命令不检查扩展功能是否完整(比如
gd开了但没支持 PNG),只看 extension_loaded() 是否返回 true
PHP 运行时扩展检测和 Composer 的边界在哪
Composer 只做「声明存在性」检查,不验证扩展是否能正常工作。比如 ext-curl 加载了,但 curl_init() 因 OpenSSL 版本太旧而失败,Composer 不会发现;又比如 ext-pdo_mysql 存在,但 MySQL 服务根本没启动,Composer 同样不管。
性能 / 兼容性影响:扩展缺失导致的错误,往往在 composer install 阶段就卡住,不会等到 autoload.php require 时才暴露。但有些扩展(如 opcache)虽非强制依赖,缺了会影响后续脚本执行效率,Composer 完全不关心。
- 真正要覆盖运行时行为,得靠项目自己的初始化检查,比如在
public/index.php开头加if (!extension_loaded('gd')) { die('GD required'); } - CI 中建议组合使用:
composer diagnose+composer check-platform-reqs+ 实际运行一个最小测试脚本 - 最容易被忽略的是:CLI 和 Web SAPI 的 php.ini 是两套,
php -v和phpinfo()显示的扩展列表可能不一致











