离线时 composer install 报 php 版本不满足,因 composer 默认联网校验 platform 配置与远程包要求,离线则回退为硬校验当前环境;可用 --ignore-platform-req=php 跳过,支持多扩展叠加指定,不可用逗号分隔;config platform.php 方式有局限且易污染代码库;可靠做法是先确认离线机 php 版本 ≥ lock 文件中 platform.php 声明值,并核对扩展可用性。

离线时 composer install 为什么报 PHP 版本不满足?
因为 Composer 默认会联网检查 platform.config 和远程包的 php 要求是否匹配,即使本地 composer.lock 已存在。离线状态下它无法获取最新平台信息或验证依赖树完整性,就直接按“当前运行环境”硬校验——而这个“当前环境”可能和 lock 文件里记录的原始构建环境不一致。
怎么让离线安装跳过 PHP 版本校验?
用 --ignore-platform-req=php 参数最直接:
composer install --ignore-platform-req=php
如果还涉及其他平台扩展(比如 ext-gd),可以叠加多个:
--ignore-platform-req=php--ignore-platform-req=ext-gd--ignore-platform-req=ext-mbstring
注意:--ignore-platform-req 是逐项指定的,不能写成 --ignore-platform-req=php,ext-gd —— 这样只会忽略第一个。
立即学习“PHP免费学习笔记(深入)”;
为什么不用 config platform.php 硬覆盖?
有人试过在 composer.json 里加:
"config": { "platform": { "php": "8.1.0" } }
这确实能骗过部分校验,但有两个坑:
- 它只影响新安装的包,对
composer.lock中已锁定的版本无强制力; - 如果 lock 文件里某个包明确要求
"php": "^8.2",而你设成"8.1.0",Composer 仍可能拒绝安装(尤其在较新版本中校验更严格); - 这个配置会被提交进代码库,容易污染团队环境。
所以离线场景下,参数方式比配置方式更干净、更可控。
离线前该做什么才真正可靠?
关键不是“怎么绕过”,而是“怎么让绕过不翻车”:
- 确保离线机器的 PHP 版本 ≥
composer.lock中platform.php字段声明的版本(查看 lock 文件顶部的platform区块); - 用
composer show --platform在目标机器上确认实际可用扩展,避免只忽略php却漏掉ext-curl这类硬依赖; - 如果项目用了
composer install --no-dev,记得离线时也带上这个参数,否则 dev-only 的 PHP 版本要求也会触发校验。
离线部署最麻烦的从来不是命令怎么敲,而是 lock 文件里藏的平台假设和真实环境之间的温差——得先看清那几行 platform 值,再决定忽略谁、忽略到哪一步。











