本文目录导读:

我来介绍 PHP 的几种更新策略和最佳实践:
版本选择策略
主版本选择
# PHP 8.x 系列(推荐) - PHP 8.3 (当前最新稳定版) - PHP 8.2 (长期支持版) - PHP 8.1 (仍有安全支持) # 避免使用 - PHP 7.x 系列(已停止安全支持) - PHP 8.0 (已停止安全支持)
更新方式
包管理器更新(推荐)
Ubuntu/Debian:
# 添加 ONDREJ PPA sudo add-apt-repository ppa:ondrej/php sudo apt update # 更新 PHP sudo apt upgrade php8.2 php8.2-common php8.2-fpm # 或安装新版本 sudo apt install php8.3 php8.3-fpm php8.3-mysql
CentOS/RHEL:
# 启用 EPEL 和 REMI 仓库 sudo yum install epel-release sudo yum install https://rpms.remirepo.net/enterprise/remi-release-8.rpm # 更新 PHP sudo yum update php
源码编译(高级用户)
# 下载源码
wget https://www.php.net/distributions/php-8.2.10.tar.gz
tar -xzvf php-8.2.10.tar.gz
cd php-8.2.10
# 编译安装
./configure --prefix=/usr/local/php8.2 \
--with-config-file-path=/etc/php8.2 \
--enable-fpm \
--with-mysqli \
--with-pdo-mysql
make
sudo make install
版本切换管理
使用 update-alternatives
# 查看已安装版本 sudo update-alternatives --list php # 切换版本 sudo update-alternatives --config php # 手动设置 sudo update-alternatives --set php /usr/bin/php8.2
使用 Docker 版本管理
FROM php:8.2-fpm # 安装扩展 RUN docker-php-ext-install pdo_mysql mysqli
平滑更新策略
针对 PHP-FPM
# 优雅重启(不中断现有连接)
sudo systemctl reload php8.2-fpm
# 零停机部署
sudo cp -r /etc/php/8.2 /etc/php/8.2.bak
sudo apt install php8.3
sudo systemctl start php8.3-fpm
# 切换流量(NGINX 配置)
upstream php_backend {
server unix:/var/run/php/php8.2-fpm.sock weight=1;
server unix:/var/run/php/php8.3-fpm.sock weight=1;
}
更新前检查清单
<?php
// 兼容性检查脚本
echo "PHP 版本: " . phpversion() . "\n";
echo "已加载扩展: \n";
print_r(get_loaded_extensions());
// 检查弃用函数
$deprecated_functions = [
'mysql_connect',
'ereg',
'split',
'each',
'create_function'
];
foreach ($deprecated_functions as $func) {
echo "{$func}: " . (function_exists($func) ? "存在" : "已移除") . "\n";
}
自动更新脚本
#!/bin/bash
# php-update.sh
CURRENT_VERSION=$(php -v | head -n 1 | cut -d " " -f 2 | cut -d "." -f 1,2)
echo "当前 PHP 版本: $CURRENT_VERSION"
# 检查最新版本
LATEST_VERSION=$(apt list --upgradable 2>/dev/null | grep php | head -n 1 | cut -d " " -f 1 | cut -d "/" -f 1)
if [ "$CURRENT_VERSION" != "$LATEST_VERSION" ]; then
echo "发现新版本: $LATEST_VERSION"
# 备份配置
cp -r /etc/php/$CURRENT_VERSION /etc/php/$CURRENT_VERSION.bak
# 更新
sudo apt update
sudo apt upgrade php* -y
# 验证更新
echo "更新后版本: $(php -v | head -n 1)"
else
echo "已是最新版本"
fi
CI/CD 集成策略
# .gitlab-ci.yml
stages:
- test
- update
php-tests:
stage: test
image: php:8.2
script:
- composer install
- php vendor/bin/phpunit
- php tools/check-compatibility.php
php-update:
stage: update
script:
- ansible-playbook -i production php-update.yml
only:
- tags
when: manual
回滚策略
# 回滚脚本 #!/bin/bash ROLLBACK_VERSION="8.1" CURRENT_VERSION=$(php -v | head -n 1 | cut -d " " -f 2 | cut -d "." -f 1,2) echo "从 $CURRENT_VERSION 回滚到 $ROLLBACK_VERSION" # 停止当前版本 sudo systemctl stop php$CURRENT_VERSION-fpm # 恢复旧版本配置 sudo cp -r /etc/php/$ROLLBACK_VERSION.bak /etc/php/$ROLLBACK_VERSION # 启用旧版本 sudo systemctl start php$ROLLBACK_VERSION-fpm # 切换 NGINX 配置 sudo sed -i "s/php$CURRENT_VERSION-fpm/php$ROLLBACK_VERSION-fpm/g" /etc/nginx/sites-enabled/* sudo systemctl reload nginx
最佳实践总结
# 生产环境更新策略 1. 先在测试环境验证 2-4 周 2. 创建完整的配置备份 3. 使用蓝绿部署或金丝雀发布 4. 监控应用错误日志 5. 保留回滚能力 6. 更新 composer.lock 7. 更新 Docker 镜像 8. 通知开发团队
推荐更新节奏:
- 安全更新:立即应用
- 小版本更新:每月检查
- 主版本更新:每 6-12 个月(等第一个补丁版本)
这样既能保持系统安全,又能降低升级风险。