composer 运行时可通过 \composer\installedversions 判断已安装包及版本约束,platform_check.php 可校验真实 php 环境,但需在各入口显式引入且注意 cli/fpm 上下文差异。

Composer 自身不感知运行环境,但 composer-runtime-api 提供的 \Composer\InstalledVersions 和平台检查机制,能让你在 PHP 运行时可靠判断“当前装了什么”“PHP 版本/扩展是否达标”,而不是靠猜或硬编码。
怎么用 \Composer\InstalledVersions 检查包是否存在或满足版本约束
它不是 Composer 命令,而是已安装后自动生成的类,只要 vendor/autoload.php 已加载就能用。关键点在于:它读的是 vendor/composer/installed.php(或 installed.json),不是 composer.json 里的声明。
-
\Composer\InstalledVersions::isInstalled('monolog/monolog')返回true表示该包实际已安装(含 dev 依赖);加第二个参数false可排除require-dev包 -
\Composer\InstalledVersions::satisfies(new \Composer\Semver\VersionParser, 'laravel/framework', '^10.0')判断当前安装的 Laravel 是否满足语义化版本约束——注意:必须传VersionParser实例,不能直接传字符串 - 别用
class_exists('Monolog\Logger')替代isInstalled():autoload 可能已注册但包未安装(比如只 require-dev 了但没启 dev mode) - 如果项目用了
composer install --no-dev,isInstalled('phpunit/phpunit')就是false,哪怕composer.json里写了require-dev
如何让运行时自动校验 PHP 版本和扩展,失败就中断
Composer 默认只在校验 install 或 update 阶段做平台检查,但你可以手动启用运行时校验,避免上线后才发现 ext-gd 缺失。
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
- 生成的
vendor/platform_check.php是个纯函数文件,不自动执行;需在入口文件(如public/index.php)顶部显式require __DIR__.'/../vendor/platform_check.php'; - 它会检查
PHP_VERSION、extension_loaded('mbstring')、PHP_INT_SIZE === 8等,失败抛出RuntimeException,不是 warning -
config.platform在composer.json里只影响依赖解析(比如假装用 PHP 7.4 解 lock 文件),**不影响**platform_check.php的实际校验逻辑 - 不要在 CLI 脚本里无条件 require 它:某些命令(如
composer dump-autoload)本身不依赖运行环境,强制校验反而导致命令失败
为什么 composer show --platform 和实际运行环境可能不一致
这个命令输出的是 Composer 当前进程看到的平台信息,但它不等于你的 Web Server 或 CLI PHP 进程的真实状态——尤其当多 PHP 版本共存时。
-
composer show --platform读的是启动 Composer 的那个 PHP 进程的phpversion()和get_loaded_extensions(),不是你nginx或php-fpm用的那个 - 常见坑:你在终端用 PHP 8.2 跑
composer install,但php-fpm配的是 PHP 8.1 →platform_check.php会在请求时爆错,而composer show --platform完全看不出 - 验证真实环境,应在目标上下文里直接调用:
php -r "echo PHP_VERSION;"(CLI)、或写个phpinfo()页面(Web) -
composer check-platform-reqs只校验composer.json中require和config.platform声明的项,不会检查代码里实际用到的扩展(比如new Redis()却没在require里写ext-redis)
真正麻烦的是跨上下文一致性:CLI、FPM、Cron、Queue Worker 很可能用不同 PHP 版本或 ini 配置,\Composer\InstalledVersions 虽然稳定,但平台检查必须在每个入口单独触发,且得确认 PHP 进程来源。别指望一次配置全局生效。










