Ubuntu PHP-FPM更新后兼容旧代码的实践指南
在升级PHP-FPM前,务必备份网站数据(如/var/www/html
)、PHP-FPM配置文件(如/etc/php/7.x/fpm/pool.d/www.conf
、/etc/php/7.x/fpm/php-fpm.conf
)及日志文件(如/var/log/php7.x-fpm.log
)。可使用以下命令快速备份:
sudo cp -R /var/www/html /var/www/html_backup
sudo cp /etc/php/7.x/fpm/pool.d/www.conf /etc/php/7.x/fpm/pool.d/www.conf.backup
sudo cp /etc/php/7.x/fpm/php-fpm.conf /etc/php/7.x/fpm/php-fpm.conf.backup
这一步可避免升级过程中数据丢失,为后续恢复提供保障。
使用工具(如phpCompatibilityChecker
)扫描代码库,定位已弃用的函数(如mysql_*
系列函数)、过时的语法(如短标签<?
)或不支持的库。例如,mysql_connect()
需替换为mysqli_connect()
或PDO,短标签需改为<?php
。
手动检查代码中是否存在以下常见问题:
mcrypt
,PHP 7.2+已移除);request_terminate_timeout
的默认值调整);@
抑制错误在PHP 8+中行为变化)。若旧代码依赖特定PHP-FPM配置,需在新版本中保留或调整参数。常见需关注的配置项包括:
pm = static
(固定进程数),新版本中需保持该设置,避免dynamic
(动态进程数)导致的进程频繁启停;request_terminate_timeout
(默认值可能更短),避免请求被强制终止;slowlog
路径(如/var/log/php-fpm/slow.log
)和阈值(如slowlog = 10s
),确保性能监控连续性;listen = /run/php/php7.x-fpm.sock
),需确保新版本的listen.owner
、listen.group
(如www-data
)和listen.mode
(如0666
)与旧版一致,避免权限问题。若旧代码无法立即兼容新PHP版本,可通过多版本共存方案过渡。例如,在Ubuntu上使用ppa:ondrej/php
仓库安装多个PHP版本(如PHP 7.4和PHP 8.2),并通过Nginx/Apache切换版本:
map
模块根据域名或路径选择PHP版本:map $host $php_version {
default "8.2";
"old.example.com" "7.4";
}
server {
listen 80;
server_name old.example.com;
location ~ \.php$ {
fastcgi_pass unix:/run/php/php7.4-fpm.sock;
include snippets/fastcgi-php.conf;
}
}
server {
listen 80;
server_name new.example.com;
location ~ \.php$ {
fastcgi_pass unix:/run/php/php8.2-fpm.sock;
include snippets/fastcgi-php.conf;
}
}
SetHandler
指令指定PHP版本:<VirtualHost *:80>
ServerName old.example.com
<FilesMatch \.php$>
SetHandler "proxy:unix:/run/php/php7.4-fpm.sock|fcgi://localhost"
</FilesMatch>
</VirtualHost>
<VirtualHost *:80>
ServerName new.example.com
<FilesMatch \.php$>
SetHandler "proxy:unix:/run/php/php8.2-fpm.sock|fcgi://localhost"
</FilesMatch>
</VirtualHost>
重启Nginx/Apache后,不同域名将指向不同PHP版本,实现平滑过渡。ubuntu:22.04
),安装旧版PHP-FPM和依赖,运行旧代码验证功能;/var/log/php8.x-fpm.log
)和Web服务器日志(如Nginx的/var/log/nginx/error.log
),及时发现兼容性问题(如502 Bad Gateway
可能由socket权限或进程管理问题导致)。若旧代码量较大,可采用分阶段迁移策略:
mysql_*
函数、短标签等导致代码无法运行的问题;mcrypt
→openssl
),调整配置参数(如pm.max_requests
从1000
调整为500
以减少内存泄漏风险);通过以上步骤,可在Ubuntu系统上实现PHP-FPM升级后与旧代码的兼容,确保业务平稳过渡。