
在 Ubuntu Docker 环境中通过 apt 安装 PHP 8.0 及扩展后,Apache 下模块正常加载,但 CLI 模式(php -v / php -m)却提示如 mbstring、curl 等函数未定义——根本原因在于系统存在多版本 PHP(如 8.0 和 8.1),而 php 命令默认指向了未安装扩展的 8.1 CLI 版本。
在 ubuntu docker 环境中通过 apt 安装 php 8.0 及扩展后,apache 下模块正常加载,但 cli 模式(php -v / php -m)却提示如 mbstring、curl 等函数未定义——根本原因在于系统存在多版本 php(如 8.0 和 8.1),而 `php` 命令默认指向了未安装扩展的 8.1 cli 版本。
该问题并非扩展未安装,而是 PHP CLI 的二进制链接被 update-alternatives 机制错误地绑定到了另一个 PHP 版本(如 php8.1),导致 php -m 查看的是 /etc/php/8.1/cli/php.ini 对应的配置,而你实际安装的扩展包(如 php8.0-mbstring)仅向 /etc/php/8.0/cli/ 目录注入了 .ini 配置文件,对 8.1 CLI 完全无效。
验证方式非常简单:
# 查看当前 php 命令指向的版本和路径 php -v ls -la $(which php) # 检查各版本 CLI 的模块列表(关键!) php8.0 -m | grep mbstring # 应显示 mbstring php8.1 -m | grep mbstring # 极可能为空
✅ 正确解决方案是显式将 php 命令的替代链(alternative)切换至目标版本:
# 在安装完所有 php8.0-* 包后,立即执行: RUN update-alternatives --set php /usr/bin/php8.0
该命令会同步更新 php、php-config、phpize 等命令的符号链接,确保 CLI 环境与 Apache 使用完全一致的 PHP 主版本和扩展配置路径(即 /etc/php/8.0/cli/)。此后运行 php -m 即可看到所有已安装的 php8.0-* 扩展。
立即学习“PHP免费学习笔记(深入)”;
⚠️ 注意事项:
- 不要手动编辑 /etc/php/8.1/cli/php.ini —— 这属于临时补救,违背“声明式配置”原则,且易在镜像重建时失效;
- 若需升级至 PHP 8.1,请统一替换所有包名(php8.1-*)并执行 update-alternatives --set php /usr/bin/php8.1;
- 在多版本共存场景下,始终优先使用 php8.0 -v 显式调用,避免依赖 php 命令的隐式解析;
- 推荐在 Dockerfile 中添加验证步骤,提升构建可靠性:
RUN php -v && php -m | grep -E '^(mbstring|curl|redis|xml)$'
总结:APT 包管理器本身不会自动设置 php 命令的默认版本;update-alternatives --set php 是 Ubuntu/Debian 系统中解耦「安装」与「启用」的标准机制,也是 Docker 环境下实现 PHP CLI 与 Web SAPI 严格对齐的最干净、最可复现的方式。



















