PHP 5.2 和 5.3 均已过时

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

php5.2升级php5.3教程
(图片来源网络,侵删)

强烈建议:如果你的服务器仍在使用 PHP 5.2 或 5.3,你应该立即规划升级到至少 PHP 7.4 或更新的 LTS 版本(如 PHP 8.0, 8.1),新版本在性能、安全性和功能上都有巨大提升。

如果你因为某些特殊原因(如维护一个极其老旧且无法修改的项目)必须进行此次升级,请务必在隔离的测试环境中进行,并仔细阅读以下内容。


第一步:升级前的准备工作(至关重要)

这一步是整个升级过程中最关键的一步,直接决定了升级是否顺利。

备份!备份!备份!

在进行任何系统级软件升级之前,请务必备份所有重要数据。

php5.2升级php5.3教程
(图片来源网络,侵删)
  • 网站文件:备份你的网站根目录(通常是 /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.confapache2.conf)中是否有 LoadModule php5_module 或类似的指令。
    • 通过 CGI/FastCGI:这种方式下,PHP 是一个独立进程,Web 服务器通过接口调用它,升级方式可能不同,通常需要重新安装 FastCGI 包。

检查 PHP 代码和依赖项

PHP 5.3 引入了许多破坏性变更(BC - Backward Compatibility Breaking Changes),这意味着很多在 PHP 5.2 下正常工作的代码在 5.3 下可能会出错。

php5.2升级php5.3教程
(图片来源网络,侵删)
  • E_ALL 错误级别:PHP 5.3 默认的 error_reporting 级别更高,会报告更多之前被忽略的警告和 Notice,这可能导致你的网站页面出现大量错误信息。
  • *`mysql_函数已废弃**:PHP 5.3 开始,mysql_connectmysql_query等函数已被标记为@deprecated`,虽然它们在 5.3 中仍然可用,但强烈建议你开始使用 PDOMySQLi,这是最常见的问题来源。
  • 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 系统:

  1. 更新软件包列表

    sudo apt-get update
  2. 安装 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 来获取特定版本。

  3. 重新配置 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 系统:

  1. 启用 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
  2. 安装 PHP 5.3

    sudo yum install php php-cli php-mysql php-gd php-common
  3. 重新启动 Apache

    sudo service httpd restart

手动编译安装(不推荐,除非你很有经验)

如果你的操作系统官方仓库没有 PHP 5.3,或者你需要自定义编译选项,可以选择这种方式。

  1. 安装编译所需的依赖库

    # 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
  2. 下载 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
  3. 配置编译选项: 运行 ./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 集成。
  4. 编译和安装

    make
    sudo make install
  5. 配置和启用

    • 复制 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_` 函数警告**:

    • 最佳方案:重写数据库连接代码,使用 PDOMySQLi,这是面向未来的做法。
    • 临时方案:如果你只是想让警告消失,可以在代码中禁用废弃函数的警告(不推荐,治标不治本)。
      ; 在 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 关键字或完全限定名称来解决。


总结与最终建议

  1. 备份是王道:没有备份,不要进行任何升级操作。
  2. 测试环境先行:永远在隔离的测试环境中完成升级和所有修复工作,确认无误后再部署到生产环境。
  3. PHP 5.3 是过渡版本:它的主要任务是让你离开早已过时的 PHP 5.2,它本身也很快被淘汰了。
  4. 制定长远计划PHP 5.3 的安全支持早已结束,你应该将此次升级视为一个跳板,尽快规划升级到 PHP 7.4 或更新的 LTS 版本,这不仅能解决所有已知的安全问题,还能让你的网站性能提升数倍,并享受到现代 PHP 带来的便利。

希望这份教程能帮助你顺利完成升级!