PHP版本升级需更换镜像而非容器内升级,须同步更新扩展、配置、Composer依赖及业务兼容性验证。

PHP版本太低,Docker里不能直接“升级”,得换镜像
PHP本身不支持在运行中的容器里像系统软件那样执行 apt upgrade php 升级——Docker 容器是无状态的,PHP 版本由基础镜像决定。所谓“升级”,本质是切换到更高版本的 PHP 镜像并重建容器。
常见错误现象:php -v 显示 7.2 或 7.4,但项目依赖要求 8.1+;改了 Dockerfile 里的 FROM 却发现扩展加载失败、composer install 报错或 ext-mbstring 找不到。
- 确认当前用的是官方镜像(如
php:7.4-apache)还是自建镜像——后者需重写构建逻辑 - 优先选
php:8.1-apache、php:8.2-cli等带明确版本号的官方标签,避免用latest(它可能指向不稳定分支) - 注意 SAPI 类型匹配:Apache 模块版(
-apache)和 CLI/FPM 版(-cli、-fpm)扩展默认不互通,别把 Apache 配置套到 FPM 镜像上
扩展和配置不能自动继承,必须显式声明
旧镜像里通过 docker-php-ext-install 装的扩展(比如 pdo_mysql、gd),在新 PHP 镜像中不会自动存在。PHP 8.x 还移除了部分扩展(如 mysql),或要求额外依赖(如 gd 需要 libpng-dev)。
典型报错:PHP Warning: PHP Startup: Unable to load dynamic library 'gd.so' 或 Class "PDO" not found。
立即学习“PHP免费学习笔记(深入)”;
- 检查新镜像的 PHP 版本对应扩展安装方式——PHP 8.0+ 的
docker-php-ext-configure参数可能变化(例如gd需加--with-webp-dir) - 把原
Dockerfile中所有docker-php-ext-install行单独拎出来,逐个验证是否兼容新版本(查 docker-library/php 的README) - INI 配置路径可能变:PHP 7.4 默认读
/usr/local/etc/php/conf.d/,而某些 Alpine 镜像用/etc/php/conf.d/,硬编码路径会失效
Composer 和依赖兼容性比 PHP 版本更早卡住你
很多项目不是 PHP 升不了,而是 composer.json 里 "php": "^7.4" 锁死了版本,或者依赖包(如 laravel/framework、doctrine/dbal)尚未适配 PHP 8.2 的严格类型检查。
运行 composer update 时出现:Your requirements could not be resolved to an installable set of packages.
- 先执行
composer check-platform-reqs看哪些扩展/PHP 版本不满足 - 临时放宽
composer.json的platform.php值(如设为"8.2.0"),再跑composer update --ignore-platform-req=php测试兼容性 - 别跳过
ext-opcache:PHP 8.0+ 强烈依赖它提升性能,新镜像默认不启用,需在Dockerfile加RUN docker-php-ext-enable opcache
数据库驱动、时区、错误报告这些细节最容易漏
PHP 升级后常出现连接 MySQL 失败、date() 返回空、E_DEPRECATED 错误突然大量报出——这些问题不报错但影响功能,容易被忽略。
-
mysqli和pdo_mysql在 PHP 8.1+ 默认启用MYSQLI_OPT_CONNECT_TIMEOUT,旧代码若没设超时,可能卡住 - PHP 8.2 开始默认时区为
UTC,而旧镜像常设Asia/Shanghai,需在php.ini显式写date.timezone = Asia/Shanghai -
error_reporting默认值变了:PHP 8.0+ 启用E_WARNING和E_NOTICE,旧项目若依赖@抑制符或未初始化变量,会暴露大量警告
最麻烦的不是换镜像,是验证所有业务路径——尤其是文件上传回调、JSON 解析、反射调用这类 PHP 版本敏感操作。建议先在 CI 里跑一遍全量单元测试,再切流量。











