PHP 5.2 和 5.3 均已过时
在开始之前,必须强调:PHP 5.2 和 PHP 5.3 都早已在 2011 年和 2025 年停止安全支持,这意味着它们没有安全补丁,存在严重的安全漏洞,并且无法与许多现代的库和框架兼容。

强烈建议:如果你的服务器仍在使用 PHP 5.2 或 5.3,你应该立即规划升级到至少 PHP 7.4 或更新的 LTS 版本(如 PHP 8.0, 8.1),新版本在性能、安全性和功能上都有巨大提升。
如果你因为某些特殊原因(如维护一个极其老旧且无法修改的项目)必须进行此次升级,请务必在隔离的测试环境中进行,并仔细阅读以下内容。
第一步:升级前的准备工作(至关重要)
这一步是整个升级过程中最关键的一步,直接决定了升级是否顺利。
备份!备份!备份!
在进行任何系统级软件升级之前,请务必备份所有重要数据。

- 网站文件:备份你的网站根目录(通常是
/var/www/html或类似路径)。 - 数据库:完全导出你的数据库(使用
mysqldump或 phpMyAdmin)。 - 配置文件:备份 PHP 配置文件(通常是
/etc/php.ini或/etc/php5/apache2/php.ini)以及 Web 服务器(如 Apache 或 Nginx)的配置文件。
检查当前 PHP 环境
-
确认当前 PHP 版本: 在命令行中运行:
php -v
你应该会看到类似
PHP 5.2.17的输出。 -
确认 Web 服务器和 PHP 的绑定方式:
- 通过 Apache 模块 (mod_php):这是最常见的方式,检查你的 Apache 配置文件(
httpd.conf或apache2.conf)中是否有LoadModule php5_module或类似的指令。 - 通过 CGI/FastCGI:这种方式下,PHP 是一个独立进程,Web 服务器通过接口调用它,升级方式可能不同,通常需要重新安装 FastCGI 包。
- 通过 Apache 模块 (mod_php):这是最常见的方式,检查你的 Apache 配置文件(
检查 PHP 代码和依赖项
PHP 5.3 引入了许多破坏性变更(BC - Backward Compatibility Breaking Changes),这意味着很多在 PHP 5.2 下正常工作的代码在 5.3 下可能会出错。

- E_ALL 错误级别:PHP 5.3 默认的
error_reporting级别更高,会报告更多之前被忽略的警告和 Notice,这可能导致你的网站页面出现大量错误信息。 - *`mysql_
函数已废弃**:PHP 5.3 开始,mysql_connectmysql_query等函数已被标记为@deprecated`,虽然它们在 5.3 中仍然可用,但强烈建议你开始使用 PDO 或 MySQLi,这是最常见的问题来源。 magic_quotes_gpc被移除:这个在 PHP 5.3 中被移除的糟糕特性,在 5.2 中默认是开启的,如果你的代码依赖它来转义输入数据,升级后必须手动处理数据转义。ereg正则表达式函数被移除:ereg,eregi,ereg_replace等函数被移除,必须替换为preg_*系列函数。set_magic_quotes_runtime()被移除:这个函数本身就被废弃了,你的代码里不应该有它。- 第三方库/扩展兼容性:检查你的项目是否使用了第三方库(如框架、CMS),确认它们是否支持 PHP 5.3,非常老的 WordPress 版本可能需要升级才能在 PHP 5.3 下运行。
建议:在升级前,将你的网站代码复制到一个测试服务器,尝试安装一个更新的 PHP 版本(5.3 或更高),看看会报什么错,提前修复。
第二步:选择升级方式
主要有两种升级方式,选择哪种取决于你的操作系统和包管理器。
使用包管理器升级(推荐,适用于 Debian/Ubuntu, CentOS/RHEL 等)
这是最简单、最安全的方式,因为包管理器会自动处理依赖关系。
对于 Debian/Ubuntu 系统:
-
更新软件包列表:
sudo apt-get update
-
安装 PHP 5.3: 在 Ubuntu 10.04 LTS (Lucid Lynx) 中,PHP 5.3 是默认的 PHP 版本,你可以直接安装:
# 安装 PHP 5.3 以及常用的模块 sudo apt-get install php5 php5-cli php5-mysql php5-gd php5-curl
注意:在更新的 Ubuntu 版本中,
php5这个包名可能已经指向了更新的 PHP 版本,你可能需要添加ppa:ondrej/php这样的 PPA 来获取特定版本。 -
重新配置 Web 服务器: 如果你是通过
apt-get安装的,Apache 的 PHP 模块通常会自动配置好,如果没自动配置,你需要启用它:# 对于 Apache 2.2 sudo a2enmod php5 sudo /etc/init.d/apache2 restart # 对于 Apache 2.4 sudo a2enmod php5.3 # 或者直接 a2enmod php sudo systemctl restart apache2
对于 CentOS/RHEL 系统:
-
启用 EPEL 仓库: PHP 5.3 在 CentOS 6.x 的官方仓库中是可用的,你需要先启用 EPEL 仓库。
# CentOS 6 sudo rpm -Uvh http://dl.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm
-
安装 PHP 5.3:
sudo yum install php php-cli php-mysql php-gd php-common
-
重新启动 Apache:
sudo service httpd restart
手动编译安装(不推荐,除非你很有经验)
如果你的操作系统官方仓库没有 PHP 5.3,或者你需要自定义编译选项,可以选择这种方式。
-
安装编译所需的依赖库:
# Debian/Ubuntu sudo apt-get install build-essential libxml2-dev libbz2-dev libjpeg-dev libpng-dev libfreetype6-dev libcurl4-openssl-dev libmcrypt-dev libmysqlclient-dev libxslt1-dev # CentOS/RHEL sudo yum install gcc-c++ make libxml2-devel bzip2-devel libjpeg-turbo-devel libpng-devel freetype-devel curl-devel libmcrypt-devel mysql-devel libxslt-devel
-
下载 PHP 5.3 源码: 从 PHP 官网下载 PHP 5.3 的最新稳定版源码包(5.3.29)。
wget http://museum.php.net/php5/php-5.3.29.tar.gz tar -xvzf php-5.3.29.tar.gz cd php-5.3.29
-
配置编译选项: 运行
./configure。这一步非常重要,你需要确保你使用的编译选项与之前 PHP 5.2 的模块(如 MySQL, GD, cURL)保持一致,你可以通过php -i | grep configure查看之前的配置参数,然后参考它进行配置。./configure --prefix=/usr/local/php53 \ --with-apxs2=/usr/sbin/apxs2 \ --with-mysql=mysqlnd \ --with-mysqli=mysqlnd \ --with-pdo-mysql=mysqlnd \ --with-gd \ --with-jpeg-dir \ --with-png-dir \ --with-freetype-dir \ --enable-mbstring \ --with-curl \ --with-mcrypt \ --with-xsl--prefix:指定安装路径。--with-apxs2:告诉编译器如何与 Apache 集成。
-
编译和安装:
make sudo make install
-
配置和启用:
- 复制
php.ini文件到正确位置。 - 修改 Apache 配置文件,加载新的 PHP 模块,并指向新安装的
php.ini。 - 重启 Apache。
- 复制
第三步:升级后的检查与问题修复
无论你选择哪种方式,升级后都需要进行仔细检查。
确认 PHP 版本
在命令行和网站页面(通过 phpinfo() 函数)中再次确认 PHP 版本是否已成功升级到 5.3。
检查 php.ini 文件
- 调整错误报告级别:如果你不希望看到过多的警告,可以在
php.ini中调整error_reporting。; 将 E_ALL 改为 E_ALL & ~E_NOTICE error_reporting = E_ALL & ~E_NOTICE
或者恢复到更接近 5.2 的级别(不推荐):
error_reporting = E_ALL & ~E_NOTICE & ~E_STRICT & ~E_DEPRECATED
- 检查
display_errors:确保display_errors设置为Off在生产环境中,以避免敏感信息泄露。
修复常见代码问题
这是最耗时但必不可少的一步,根据你之前的检查,逐一修复代码:
-
*处理 `mysql_` 函数警告**:
- 最佳方案:重写数据库连接代码,使用 PDO 或 MySQLi,这是面向未来的做法。
- 临时方案:如果你只是想让警告消失,可以在代码中禁用废弃函数的警告(不推荐,治标不治本)。
; 在 php.ini 中添加 error_reporting = E_ALL & ~E_DEPRECATED
-
处理
magic_quotes_gpc: 如果你的代码依赖它,你需要创建一个兼容层来模拟它的行为。if (get_magic_quotes_gpc()) { function stripslashes_deep($value) { $value = is_array($value) ? array_map('stripslashes_deep', $value) : stripslashes($value); return $value; } $_POST = array_map('stripslashes_deep', $_POST); $_GET = array_map('stripslashes_deep', $_GET); $_COOKIE = array_map('stripslashes_deep', $_COOKIE); $_REQUEST = array_map('stripslashes_deep', $_REQUEST); } -
处理
ereg函数: 将ereg_replace替换为preg_replace。ereg_replace('pattern', 'replacement', $subject)->preg_replace('/pattern/', 'replacement', $subject)eregi_replace('pattern', 'replacement', $subject)->preg_replace('/pattern/i', 'replacement', $subject)ereg('pattern', $subject)->preg_match('/pattern/', $subject)eregi('pattern', $subject)->preg_match('/pattern/i', $subject)
-
处理命名空间问题: PHP 5.3 引入了命名空间,如果你的代码中使用了与 PHP 内置函数/类同名的名称,可能会导致
Fatal error,使用use关键字或完全限定名称来解决。
总结与最终建议
- 备份是王道:没有备份,不要进行任何升级操作。
- 测试环境先行:永远在隔离的测试环境中完成升级和所有修复工作,确认无误后再部署到生产环境。
- PHP 5.3 是过渡版本:它的主要任务是让你离开早已过时的 PHP 5.2,它本身也很快被淘汰了。
- 制定长远计划:PHP 5.3 的安全支持早已结束,你应该将此次升级视为一个跳板,尽快规划升级到 PHP 7.4 或更新的 LTS 版本,这不仅能解决所有已知的安全问题,还能让你的网站性能提升数倍,并享受到现代 PHP 带来的便利。
希望这份教程能帮助你顺利完成升级!
