1. 为什么要升级PHP?
每个PHP版本都有有限的支持生命周期。一旦版本达到EOL(生命周期结束),将不再接收安全补丁,使服务器面临已知漏洞的攻击风险。
- 安全性 — EOL版本不再接收安全补丁
- 性能 — PHP 8.x在许多基准测试中比PHP 7.x快2-3倍
- 兼容性 — Laravel 11+等框架需要PHP 8.2+
- 新特性 — JIT编译器、命名参数、联合类型、Fibers都是PHP 8.x的功能
2. PHP版本与EOL时间表
| PHP版本 | 发布时间 | 主动支持至 | 安全支持(EOL) | 状态 |
|---|---|---|---|---|
| PHP 8.4 | 2024年11月 | 2026年11月 | 2028年11月 | ✅ 推荐 |
| PHP 8.3 | 2023年11月 | 2025年11月 | 2027年11月 | ✅ 支持中 |
| PHP 8.2 | 2022年12月 | 2024年12月 | 2026年12月 | ⚠️ 仅安全更新 |
| PHP 8.1 | 2021年11月 | 2023年11月 | 2025年12月 | ❌ 即将EOL |
| PHP 8.0 | 2020年11月 | 2022年11月 | 2023年11月 | ❌ 已EOL |
| PHP 7.4 | 2019年11月 | 2021年11月 | 2022年11月 | ❌ 已EOL |
3. 升级前的准备工作
未经准备直接升级PHP可能立即导致网站宕机。以下步骤可以最大程度降低风险。
3.1 检查当前PHP版本
php -v
# PHP 7.4.33 (cli) ...
systemctl status php7.4-fpm
3.2 全面备份
# 数据库备份
mysqldump -u root -p --all-databases > /backup/all-db-$(date +%Y%m%d).sql
# 网站文件
tar -czf /backup/webroot-$(date +%Y%m%d).tar.gz /var/www/
# Nginx配置
cp -r /etc/nginx /backup/nginx-$(date +%Y%m%d)
# PHP配置
cp -r /etc/php /backup/php-$(date +%Y%m%d)
3.3 检查代码兼容性
composer require --dev phpcompatibility/php-compatibility
vendor/bin/phpcs --standard=PHPCompatibility \
--runtime-set testVersion 8.3 \
/var/www/html/
3.4 先在测试环境验证
将生产环境克隆到测试VM或容器中,安装新PHP版本,运行完整的测试套件,然后再操作生产环境。
4. 在Ubuntu上安装新PHP版本
使用Ondřej Surý的PPA — Ubuntu/Debian上管理多PHP版本的标准来源。
sudo apt install -y software-properties-common
sudo add-apt-repository ppa:ondrej/php -y
sudo apt update
sudo apt install -y \
php8.3 \
php8.3-fpm \
php8.3-mysql \
php8.3-mbstring \
php8.3-xml \
php8.3-curl \
php8.3-zip \
php8.3-gd \
php8.3-intl \
php8.3-bcmath \
php8.3-opcache \
php8.3-redis
php8.3 -v
5. 配置Nginx + PHP-FPM
5.1 验证PHP-FPM Socket
ls /run/php/php8.3-fpm.sock
sudo systemctl start php8.3-fpm
sudo systemctl enable php8.3-fpm
sudo systemctl status php8.3-fpm
5.2 更新Nginx配置指向PHP 8.3
server {
listen 80;
server_name example.com;
root /var/www/html;
index index.php index.html;
location / {
try_files $uri $uri/ /index.php?$query_string;
}
location ~ \.php$ {
include snippets/fastcgi-php.conf;
# 升级时修改此处的socket路径
fastcgi_pass unix:/run/php/php8.3-fpm.sock;
}
}
sudo nginx -t && sudo systemctl reload nginx
6. 切换流量前的测试
6.1 验证PHP版本
echo "<?php phpinfo(); ?>" > /var/www/html/phpinfo-test.php
curl -s http://localhost/phpinfo-test.php | grep -i "php version"
# 测试后务必删除此文件!
rm /var/www/html/phpinfo-test.php
6.2 应用测试
# Laravel
php8.3 artisan migrate:status
php8.3 artisan config:clear
php8.3 artisan cache:clear
# 监控日志
tail -f /var/log/nginx/error.log
tail -f /var/log/php8.3-fpm.log
6.3 验证OPcache
php8.3 -r "echo opcache_get_status()['opcache_enabled'] ? 'OPcache 已启用' : 'OPcache 未启用';"
7. 切换PHP版本
# 编辑Nginx站点配置
sudo nano /etc/nginx/sites-available/mysite.conf
# 修改: fastcgi_pass unix:/run/php/php7.4-fpm.sock;
# 改为: fastcgi_pass unix:/run/php/php8.3-fpm.sock;
sudo nginx -t && sudo systemctl reload nginx
# 设置CLI默认版本
sudo update-alternatives --set php /usr/bin/php8.3
| 检查命令 | 预期结果 |
|---|---|
php -v | 显示8.3.x |
curl -I https://example.com | HTTP 200 |
systemctl status php8.3-fpm | active (running) |
nginx -t | syntax is ok |
8. 紧急回滚方法
# 编辑Nginx配置回退socket
sudo nano /etc/nginx/sites-available/mysite.conf
# 改回: fastcgi_pass unix:/run/php/php7.4-fpm.sock;
sudo nginx -t && sudo systemctl reload nginx
# 确保旧版PHP-FPM在运行
sudo systemctl status php7.4-fpm
# 如果未运行,先启动
sudo systemctl start php7.4-fpm
8.1 通过快照回滚(最快方式)
如果VPS提供商支持快照(AsiaGB VPS提供快照服务),恢复升级前的快照即可让所有内容在5-10分钟内恢复到升级前状态,无需手动修改配置。
9. 升级后的监控
9.1 实时查看错误日志
sudo tail -f /var/log/php8.3-fpm.log
sudo tail -f /var/log/nginx/error.log
9.2 检查OPcache命中率
php8.3 -r "
\$s = opcache_get_status();
\$hit = \$s['opcache_statistics']['hits'];
\$miss = \$s['opcache_statistics']['misses'];
\$total = \$hit + \$miss;
echo '命中率: ' . round(\$hit/\$total*100, 2) . '%\n';
"
热身30分钟后,良好的OPcache命中率应达到90%以上。
9.3 调整PHP-FPM进程池配置
# /etc/php/8.3/fpm/pool.d/www.conf
pm = dynamic
pm.max_children = 20
pm.start_servers = 5
pm.min_spare_servers = 3
pm.max_spare_servers = 8
pm.max_requests = 500
10. 总结
在Nginx VPS上安全升级PHP需要五个关键步骤:
- 准备 — 备份、快照、兼容性检查
- 安装 — 新PHP版本、PHP-FPM和扩展
- 配置 — 更新Nginx的fastcgi_pass指向新socket
- 测试 — 先在测试环境验证,再操作生产环境
- 监控 — 查看日志、OPcache命中率和资源使用情况
操作得当,升级PHP不应有任何停机时间 — PHP-FPM允许同时运行两个版本,仅需重载Nginx即可瞬间完成切换。
需要支持快照功能、响应迅速的VPS?了解AsiaGB泰国VPS — SSD存储,99%正常运行时间保障。
常见问题
应该多久升级一次PHP?
遵循PHP发布周期 — 每6-12个月升级小版本,每1-2年升级大版本。在EOL前至少3-6个月开始升级,留出足够时间进行兼容性测试。
PHP-FPM和mod_php有什么区别?
PHP-FPM(FastCGI进程管理器)将PHP与Web服务器分离运行,可以更好地控制资源并同时运行多个版本。mod_php直接嵌入Apache中。Nginx始终使用PHP-FPM。
升级PHP后网站变慢了怎么办?
检查OPcache是否已启用,查看PHP错误日志中是否有大量deprecated警告,运行php -i | grep opcache确认扩展已加载。同时验证PHP-FPM池的max_children是否足以处理流量。
Nginx上能同时运行多个PHP版本吗?
可以 — 每个PHP-FPM版本使用独立的socket文件。在Nginx的每个server块中将fastcgi_pass指向所需PHP版本的socket即可实现不同站点使用不同PHP版本。
如果回滚失败该怎么办?
如果VPS提供商支持快照功能,可恢复升级前的快照。否则恢复数据库备份并从git重新部署稳定版本代码。这就是为什么升级前必须做备份。
升级PHP后WordPress会出现哪些错误?
常见问题包括:插件使用了PHP旧版本中已废弃的函数如create_function()、each()、split(),以及PHP 8.x严格模式下的undefined variable或类型错误。始终在升级PHP前更新插件,并先在测试环境中验证。