composer diagnose通过≠环境达标,它只检查composer自身依赖扩展,不校验项目所需的ext-gd等扩展;真正暴露项目缺口的是composer check-platform-reqs,结合php -m | grep -e筛查缺失项、php --ini定位cli配置文件、运行时函数如php -r "print_r(gd_info());"验证扩展能力。

composer diagnose 通过 ≠ 环境达标,它只查 Composer 自身能跑,不查你项目要的扩展。真要自检,得用组合命令,而不是等 composer install 报错才动手。
php -m | grep -E 命令筛出关键扩展是否启用
报错里写的 ext-mbstring、ext-curl,不是让你去猜,而是让 PHP 自己列出来:php -m | grep -E 'mbstring|curl|openssl|xml|zip|json|phar|gd|intl'
没输出的那几行,就是 Composer 卡住的真凶。
常见陷阱:
- Windows 用户没法用
grep,直接运行php -m后肉眼扫一遍就行 - macOS/Linux 可加
| grep -v "disabled"排掉注释干扰 - 输出里有
mbstring不代表就可用——还得验证运行时能力:php -r "echo mb_strlen('测试');",报错说明虽加载但没生效
php --ini 确认 CLI 真正读的是哪个 php.ini
很多人改了 Apache 的 php.ini,结果 composer install 还是报错——因为 Composer 跑在命令行里,只认 CLI 模式加载的配置。
执行:php --ini
重点看 Loaded Configuration File 那一行路径,比如 /etc/php/8.2/cli/php.ini 或 C:\xampp\php\php.ini。别碰 phpinfo() 页面里显示的那个文件,大概率是 Web SAPI 的。
打开这个文件后,检查这几行是否已取消注释:
-
extension=mbstring(Linux/macOS)或extension=php_mbstring.dll(Windows) -
extension=curl/extension=php_curl.dll -
extension=openssl/extension=php_openssl.dll
Windows 下还要确认 extension_dir 指向的目录下真有对应 .dll 文件;Linux/macOS 则要确保 extension_dir 输出路径下存在 mbstring.so 这类文件。
composer check-platform-reqs 曝光项目级扩展缺口
composer diagnose 只查自身强依赖(如 json、mbstring),完全不读 composer.json 里的 "ext-gd": "*" 这种声明。真正暴露项目真实需求的命令是:
composer check-platform-reqs
它会列出所有 composer.json 中声明的 PHP 版本、扩展、函数要求及其满足状态。输出里出现 ext-gd * missing 就说明 GD 扩展没启用,哪怕 diagnose 全绿也掩盖不了。
注意参数差异:
- 默认只检查生产依赖
- 加
--with-dependencies会递归检查所有依赖项(包括require-dev)的平台要求
不同 PHP 安装方式,修复动作不能混用
你用什么方式装的 PHP,就得按它的规则来补扩展,混着操作基本会失效:
- Ubuntu/Debian:
sudo apt install php8.2-mbstring php8.2-xml php8.2-curl(版本号必须和php -v一致) - macOS Homebrew:
brew install php@8.2-intl,再检查$(brew --prefix)/etc/php/8.2/conf.d/ext-intl.ini是否被加载 - Windows XAMPP/WAMP:改
php.ini后,必须重启整个控制面板里的 Apache + MySQL + PHP 服务,只重启 Apache 不够 - Docker:
RUN docker-php-ext-install mbstring xml curl,不能只写apt install php-mbstring,那装的是系统包,不是 PHP 扩展
装完别跳步,立刻跑一次 php -m | grep mbstring 验证——只要没输出,就说明还没生效。
最常被忽略的是:有些扩展(比如 ext-gd、ext-intl)光出现在 php -m 里还不够,得用 php -r "print_r(gd_info());" 这类运行时函数验证能力是否真就位。











