应采用多版本共存方案,通过 update-alternatives(Ubuntu/Debian)或 alternatives(CentOS/RHEL)统一管理 PHP 二进制路径,Web 服务需单独配置对应模块或 php-fpm 实例并重启,同时分别核对 CLI 与 Web 环境的 php.ini 路径及扩展配置。

PHP 版本太低,php -v 显示 5.6 或 7.0 怎么办
系统默认 PHP 版本过低(比如 CentOS 7 自带 php-5.4,Ubuntu 16.04 默认 php7.0),而项目需要 php7.4 或 php8.1 以上,直接重装会破坏系统依赖。不能硬删,得用多版本共存方案。
核心思路是:不替换系统 PHP,而是通过符号链接或环境变量切换当前 shell 或 Web 服务使用的 php 二进制路径。
- Web 服务(如 Apache/Nginx)需配合
libphp模块或php-fpm实例切换,不能只改命令行 - 命令行切换推荐用
update-alternatives(Debian/Ubuntu)或alternatives(CentOS/RHEL),比手动改/usr/bin/php链接更安全 - 如果已用
phpbrew或asdf,优先走它们的use命令,避免和系统包管理器冲突
Ubuntu/Debian 用 update-alternatives 切换 PHP 版本
这是最稳妥的系统级切换方式,php、phpize、php-config 可统一管理。
假设你已通过 ondrej/php PPA 安装了多个版本:
立即学习“PHP免费学习笔记(深入)”;
sudo add-apt-repository ppa:ondrej/php sudo apt update sudo apt install php7.4 php8.1 php8.2-cli php8.2-fpm
然后注册到 alternatives:
sudo update-alternatives --install /usr/bin/php php /usr/bin/php7.4 74 sudo update-alternatives --install /usr/bin/php php /usr/bin/php8.1 81 sudo update-alternatives --install /usr/bin/php php /usr/bin/php8.2 82
切换时执行:
sudo update-alternatives --config php
终端会列出选项,输入编号即可。注意:php -v 生效,但 Apache 的 mod_php 不受影响——它取决于 a2enmod 启用的模块;Nginx + PHP-FPM 则需重启对应 php8.2-fpm 服务。
CentOS/RHEL 用 alternatives 管理 PHP 多版本
RedHat 系发行版没有 update-alternatives 的交互式菜单,但 alternatives 命令功能一致。
例如安装了 php74 和 php82(来自 Remi 仓库):
sudo yum install php74-php-cli php82-php-cli sudo alternatives --install /usr/bin/php php /usr/bin/php74 74 --slave /usr/bin/php-cgi php-cgi /usr/bin/php74-cgi sudo alternatives --install /usr/bin/php php /usr/bin/php82 82 --slave /usr/bin/php-cgi php-cgi /usr/bin/php82-cgi
切换命令:
sudo alternatives --config php
关键点:--slave 参数确保关联命令(如 php-cgi)同步切换,否则 Web 服务可能调用错版本。Apache 的 libphp 模块路径通常为 /opt/remi/php82/root/usr/lib64/httpd/modules/libphp.so,需手动在 /etc/httpd/conf.modules.d/15-php.conf 中指定,不能靠 alternatives 自动处理。
Web 服务不生效?检查 phpinfo() 和 fpm 实际监听端口
命令行 php -v 显示新版,但 phpinfo() 还是旧版,说明 Web 层根本没走你切的那个版本。
- Apache + mod_php:确认加载的是哪个
libphp.so,用httpd -M | grep php查模块,再查LoadModule行指向的路径 - Nginx + php-fpm:检查
fastcgi_pass指向的 socket 或端口,再查对应php-fpm服务用的配置文件(如/etc/php-fpm.d/www.conf中的php_admin_value[extension_dir]) - 运行
ps aux | grep php-fpm,看进程启动时用了哪个php-fpm二进制(如/usr/bin/php-fpm82)
最容易忽略的一点:不同 PHP 版本的 php.ini 路径完全不同(php --ini 显示 CLI 路径,phpinfo() 显示 Web 路径),扩展是否启用、date.timezone 是否一致,都得分别核对。











