
platform-check 是什么,它不解决什么
platform-check 是 Composer 2.2+ 内置的一个命令,用来在当前 PHP 环境下验证 composer.json 中声明的 platform 和 require 是否满足——比如你写了 "php": "^8.1",但实际运行在 PHP 7.4 上,它就会报错。
但它**不是**安装时自动触发的检查,也不影响 composer install 的默认行为;它也不会检查扩展是否已启用(比如 ext-mbstring 被禁用但 ini 文件里没注释掉),只看 extension_loaded() 的运行时结果。
常见错误现象:composer install 成功了,但项目一跑就报 Class not found 或 Function not found ——这时候回过头跑 composer platform-check,往往能立刻暴露 PHP 版本或扩展缺失问题。
怎么手动触发 platform-check 并让它真正起作用
直接运行 composer platform-check 即可。它会读取 composer.json 的 config.platform(如果存在)和 require 中的 php、ext-*、lib-* 声明,然后逐项校验。
立即学习“PHP免费学习笔记(深入)”;
如果只校验 PHP 版本,确保 composer.json 里有类似 "php": ">=8.1.0 的约束,而不是笼统写 <code>"^8.1"(后者在旧版 Composer 解析可能不严谨)检查扩展必须写全名:用 "ext-mbstring": "*",不能写 "mbstring": "*",否则会被忽略若项目依赖 lib-iconv,需明确写 "lib-iconv": "*";仅靠 ext-iconv 不代表系统级 lib 可用CI/CD 中建议在 composer install 前加一行 composer platform-check –no-dev(排除 dev 依赖干扰)
为什么有时 platform-check 没报错,但 runtime 还是失败
因为 platform-check 只做静态环境探测,不模拟加载过程。典型坑点:
ext-redis 已启用,但 redis.session.locking_enabled 这类 INI 配置缺失 → platform-check 不管 ini 设置ext-gd 存在,但没编译 PNG 支持 → 扩展存在,功能残缺,platform-check 无法识别使用 Docker 时,composer platform-check 在构建阶段运行,而实际运行容器 PHP 版本不同 → 必须在目标运行环境里执行config.platform 覆盖了真实环境(如设成 "php": "8.0"),导致 platform-check 总是“通过”,掩盖真实不兼容
替代方案:用 require-runtime + 自定义脚本兜底
如果你需要更细粒度控制(比如检查某个函数是否存在、某个常量是否定义),platform-check 就不够用了。这时可以:
在 composer.json 的 autoload.files 中注册一个启动检查文件,里面用 function_exists() 或 extension_loaded() 做运行时断言把关键检查逻辑写进 scripts,例如:"post-autoload-dump": "php -r \"if (!extension_loaded(‘opcache’)) die(‘opcache required’);\""避免在 require 里滥用 lib-*:比如 "lib-pcre": ">=10.30" 看似合理,但 PHP 不暴露 PCRE 版本号,这个检查永远跳过
最常被忽略的是:platform-check 不校验扩展的版本号(如 ext-mongodb: "^1.13"),只认存在性。真要控扩展版本,得靠运行时判断或文档约定。

评论(0)