Docker构建多版本PHP测试矩阵的核心是同一套代码下多版本并行执行、独立验证、结果可比对;需定义版本与测试类型,用docker-compose声明多服务并行运行,统一输出结构化结果并比对,支持多架构验证。

用 Docker 构建多版本 PHP 测试矩阵,核心不是“跑通一个版本”,而是让多个 PHP 版本在**同一套代码下并行执行、独立验证、结果可比对**。关键在于环境隔离、运行可控、输出统一。
一、定义测试矩阵:明确要覆盖的版本和场景
先列清楚目标版本(如 7.4、8.0、8.2、8.3),再区分两类测试:
- 语法兼容性测试:检查代码是否能在各版本中成功解析(如避免 PHP 8.0+ 的联合类型直接写在 7.4 中)
- 运行时行为测试:验证功能逻辑是否一致(如 array_key_first() 在 7.3+ 才有,低版本需 polyfill)
建议用 composer.json 中的 "php": "^7.4 || ^8.0" 约束作为起点,再反向推导需覆盖的最小/最大版本。
二、用 docker-compose 定义多版本服务组
不推荐为每个版本单独写一份 compose 文件,而应在一个 docker-compose.yml 中声明多个 PHP CLI 服务,共用同一套挂载和网络:
立即学习“PHP免费学习笔记(深入)”;
- 每个服务使用显式标签镜像,例如
php:7.4-cli-alpine、php:8.2-cli - 全部服务共享
backend自定义网络,但不暴露端口(CLI 模式无需监听) - 统一挂载项目根目录到
/app,确保各容器读取完全相同的源码和测试文件 - 通过
command覆盖默认启动命令,例如sh -c "php -v && phpunit --colors=never"
这样运行 docker-compose up --abort-on-container-exit php74 php82 就能并行触发两版测试,并在任一失败时立即停止。
三、统一采集与比对测试结果
避免人工翻日志,让每个容器把结果输出为结构化格式:
- 在容器内执行测试时加参数生成 JUnit XML:
phpunit --log-junit /tmp/result.xml - 用 volume 或
docker cp把各容器的/tmp/result.xml拷贝到宿主机对应子目录(如results/php74/) - 用简单脚本比对各版本的
tests、failures、errors数值,或用diff -q判断 XML 内容是否一致
若某版本报 Fatal error: Uncaught ParseError,说明存在硬性语法不兼容;若仅 failures 数量不同,则需查具体断言差异。
四、进阶:自动触发 + 多架构验证
当需要验证 arm64/macOS M 系列或 Windows WSL 场景时,可结合 BuildKit:
- 在
Dockerfile.test中基于FROM php:${VERSION}-cli安装 PHPUnit 和依赖 - 用
docker buildx build --platform linux/amd64,linux/arm64 -t myapp/test:${VERSION} .构建双架构镜像 - 再用
docker run --platform linux/arm64 myapp/test:8.2显式指定架构运行
这样就不再依赖本地 QEMU 模拟,真正验证跨平台下的实际行为。



















