composer show -p 仅列出 composer 认为已启用的平台包,依据 extension_loaded() 检测或 composer.json 中 config.platform 的显式声明,不扫描 php.ini 或枚举所有扩展。

composer show -p 不列出“所有扩展”,只列 Composer 认为已启用的平台包
它不会扫描 php.ini 或遍历所有可能的扩展名,而是依赖两件事:运行时 extension_loaded() 检测结果,或 composer.json 中 config.platform 的显式声明。没加载、没声明、被设为 false 的扩展,就不会出现在输出里。
- 比如
ext-pdo没在php.ini启用 →composer show -p不会显示它 - 但如果你在
composer.json里写了"platform": {"ext-pdo": true},哪怕 PHP 实际没装,它也会强行出现 - 反过来,写
"ext-pdo": false就会从列表中剔除,哪怕扩展真实存在
想确认某个扩展是否真能用,别只信 show -p
composer show -p 是 Composer 对环境能力的“声明快照”,不是运行时状态检查。它不等于 php -m,也不等价于 php -i | grep -i pdo。
- 先运行
php -m | grep pdo看模块是否加载成功(注意大小写,pdo_mysql≠pdo) - 再查
php --ini确认生效的配置文件路径,避免改了错的php.ini - 如果 CI 脚本里用
composer show -p | grep ext-pdo做判断,得确保该阶段的 PHP 环境和扩展加载状态与运行时一致
show -p 输出为空?常见原因就这三类
不是命令坏了,是环境或配置没对上。
- 项目根目录下没有
composer.json→ 报错或无输出(不是空列表,是根本无法初始化 PlatformRepository) -
composer.json里没写config.platform,且当前 PHP 没启用任何扩展(比如最小化 Docker 镜像)→ 输出确实可能为空 - PHP 版本太低或太高,导致 Composer 自动跳过部分平台包探测逻辑(尤其
lib-*类,如lib-iconv在 Alpine 上常漏报)
替代方案:要完整扩展列表,用 PHP 原生命令
composer show -p 的设计目标从来不是“穷举所有扩展”,它只服务于依赖解析时的兼容性判断。真要看到全部,就得绕过 Composer:
-
php -m:列出所有已加载的 Zend 模块(含pdo、curl、json等) -
php -r "print_r(get_loaded_extensions());":更精确的数组输出,方便 grep 或脚本处理 -
php --ri mbstring:查单个扩展的详细信息(INI 设置、版本、支持编码等)
平台包本质是虚拟声明,不是真实文件;它的价值在于让 Composer 能把“PHP 8.2 + ext-gd”当作一个可约束的依赖项来处理——而不是帮你做运维巡检。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











