离线时需在目标机器执行 composer install --no-scripts --no-plugins,提前验证 php -m | grep redis 等扩展是否存在,禁用 platform 欺骗或 --ignore-platform-reqs 等不可靠方案,确保 lock 文件与目标 php 大版本一致。

离线时 composer install 报 “ext-redis not found” 怎么办
离线环境无法触发 PHP 扩展的运行时检测,但 Composer 仍会校验 ext-* 是否在目标环境中可用——它查的是当前执行 composer 命令的 PHP 环境,不是目标部署机。所以常见错误是:你在开发机(装了 redis 扩展)跑 composer install,但部署机没装,却误以为“本地能过就代表没问题”。
实操建议:
- 必须在**目标离线机器**上执行
composer install --no-scripts --no-plugins,避免因扩展缺失导致脚本中断 - 提前确认目标机已启用所需扩展:检查
php -m | grep redis或php -i | grep "redis\.so" - 若目标机确实不能装扩展(如容器无权限、系统受限),只能删掉
ext-redis这类 require 中的扩展约束——但要同步移除依赖它的包(比如predis/predis或laravel/framework的 redis 驱动)
用 platform 配置骗过扩展检查是否可靠
在 composer.json 里加 "platform" 是常见做法,但它只影响依赖解析阶段,不改变实际运行时行为。比如写 "ext-redis": "7.4.0",Composer 就不再报错,但代码一调 new Redis() 仍会 fatal error。
适用场景有限:
- 仅用于构建阶段需绕过校验(例如 CI 打包时 PHP 环境不全)
-
platform的版本号必须与目标机 PHP 版本兼容,否则可能引发依赖降级或选错包版本 - 不能解决扩展函数不存在的问题——
extension_loaded('redis')依然返回false
离线打包前如何预检扩展依赖
别等到了现场才发现少装了 ext-gd 或 ext-mbstring。离线部署成败关键在前期验证。
推荐动作:
- 用目标机的
php -r "print_r(get_loaded_extensions());"导出已启用扩展列表,和composer show --platform对比缺项 - 把
composer.json中所有ext-*条目提取出来,逐条在目标机执行php -m | grep xxx - 如果项目用了
symfony/flex,注意它会在安装时动态检查扩展——离线时得先禁用:设环境变量COMPOSER_NO_INTERACTION=1并删掉symfony.lock中相关 recipe 记录
composer install --ignore-platform-reqs 的真实作用
这个参数不是“跳过扩展检查”,而是跳过所有平台约束,包括 PHP 版本、扩展、甚至 lib-* 。它本质是让 Composer 忽略 platform 和自身对环境的探测结果,强行按 lock 文件还原依赖树。
风险点很实在:
- 如果 lock 文件里记录了需要
ext-igbinary的phpredis版本,而目标机没装,--ignore-platform-reqs不会阻止安装,但后续任何序列化操作都会崩 - 它不会帮你下载扩展本身——PHP 扩展必须由系统包管理器(apt/yum)或编译安装,Composer 完全不碰 .so/.dll 文件
- CI/CD 流水线里慎用,容易掩盖环境不一致问题
真正离线可用的组合是:composer install --no-scripts --no-plugins --ignore-platform-reqs + 提前在目标机配好所有 ext-* + 确保 lock 文件来自相同 PHP 大版本环境










