Composer 不直接校验 PHP 版本,仅在 install/update 时检查 composer.json 中 require.php 声明的版本要求;config.platform.php 仅影响依赖解析,不校验实际环境;推荐用 composer check-platform-reqs 或脚本预检 php -v。

Composer 本身不直接校验 PHP 版本兼容性,它只在安装/更新时检查 composer.json 中声明的 php 环境要求(如 "php": "^8.1"),并对比当前运行的 PHP 版本。真正起作用的是 composer install 和 composer update 的前置检查机制。
查看当前项目声明的 PHP 版本要求
打开项目的 composer.json,定位到 require 或 config.platform.php 字段:
-
require.php是项目运行时最低 PHP 版本约束(影响依赖解析) -
config.platform.php是“伪装”的 PHP 版本(仅用于依赖解析,不检查实际环境)
例如:
{
"require": {
"php": "^8.1",
"monolog/monolog": "^3.0"
},
"config": {
"platform": {
"php": "7.4.33"
}
}
}
注意:config.platform.php 会覆盖真实 PHP 版本进行依赖计算——这常被误用为“绕过版本检查”,但会导致运行时报错。
立即学习“PHP免费学习笔记(深入)”;
运行时检测是否满足 require.php 要求
执行以下命令,Composer 会立即报错并退出(如果当前 PHP 版本不满足 require.php):
composer install --dry-run
或更轻量的方式(不读取 lock 文件,仅校验环境):
composer check-platform-reqs
该命令会输出类似:
PHP 8.0.30 (64-bit) is not allowed by your platform config, you need PHP >=8.1.0
常见错误现象:
-
Your requirements could not be resolved to an installable set of packages.—— 实际是 PHP 版本太低,但 Composer 把它归类为依赖冲突 -
Root composer.json requires php ^8.1 but your php version (7.4.33) does not satisfy that requirement.—— 明确提示,但只在install/update时出现
强制跳过 PHP 版本检查的风险操作
某些 CI 或旧环境会用 --ignore-platform-req=php 强行继续:
composer install --ignore-platform-req=php
这不会让不兼容的包变兼容。后果包括:
- 安装了仅支持 PHP 8.2 的扩展,但在 PHP 8.0 下运行时抛出
ParseError或UndefinedFunctionError - 依赖中使用了
match表达式、枚举、只读类等新语法,老版本 PHP 直接解析失败 -
vendor/autoload.php加载阶段就 fatal error,根本进不了业务逻辑
真正安全的做法是:先确认 php -v 输出与 composer.json 中 require.php 兼容,再执行安装。
在 CI/CD 中自动化验证 PHP 版本
推荐在脚本开头显式校验,比依赖 Composer 报错更早暴露问题:
#!/bin/bash EXPECTED_PHP="^8\.1" ACTUAL_PHP=$(php -r "echo PHP_VERSION;") if ! [[ $ACTUAL_PHP =~ $EXPECTED_PHP ]]; then echo "ERROR: Expected PHP $EXPECTED_PHP, got $ACTUAL_PHP" exit 1 fi composer install
注意正则写法:^8\.1 匹配 8.1.x,^8\.1\. 更精确;避免用 php -v | head -n1,因输出格式可能含额外字符(如 ZTS、debug 标识)。
复杂点在于:有些项目用 config.platform.php 声明“目标部署环境”,而本地开发用更高版本 PHP —— 这时 check-platform-reqs 反而会误报。务必分清“开发环境 PHP 版本”和“部署平台要求”的区别,后者应由部署流程保障,而非开发机模拟。











