执行迁移
从当前版本实际迁移到 PHP 版本 8 的过程很像在现有应用程序中部署新功能的过程。如果可能,您可以考虑并行运行两个网站,直到您确信新版本能按预期运行为止。为此,许多组织会将暂存环境与生产环境并行运行。
在本节中,我们将介绍成功迁移的十二步指南。虽然我们关注的是迁移到 PHP 8,但这十二个步骤也适用于任何 PHP 更新。理解并认真遵循这些步骤对生产网站的成功至关重要。在这十二个步骤中,如果遇到问题,还有很多地方可以恢复到以前的版本。
在详细介绍之前,先概括一下从旧版本 PHP 向 PHP 8 移植的十二个步骤:
-
仔细阅读 PHP 文档附录中相应的迁移指南。在本例中,我们选择了从 PHP 7.4x 迁移到 PHP 8.0x。( https://www.php.net/manual/en/appendices.php )。
-
确保您当前的代码能在当前版本的 PHP 上运行。
-
备份数据库(如果有)、所有源代码以及任何相关文件和资产(例如 CSS、JavaScript 或图形图像)。
-
在版本控制软件中为即将更新的应用程序代码创建一个新分支。
-
扫描 BC 中断(可使用上一节讨论的
BreakScan
类)。 -
更新任何不兼容的代码。
-
根据需要重复步骤 5 和 6。
-
将源代码上传到版本库。
-
在升级到 PHP 8 的虚拟环境中测试源代码,该环境应与生产服务器的环境非常相似。
-
如果虚拟化模拟不成功,返回步骤 5。
-
将暂存服务器(或同等的虚拟环境)更新到 PHP 8,确保可以切换回旧版本。
-
运行您能想象到的所有测试。如果不成功,切换回主分支并返回第 5 步。如果成功,将暂存环境克隆到生产环境。
现在让我们依次来看看每个步骤。
第 1 步 – 查看迁移指南
每当 PHP 发布一个重要版本,PHP 核心团队都会发布一份迁移指南。本书主要涉及的指南是从 PHP 7.4.x 迁移到 PHP 8.0.x,位于 https://www.php.net/manual/en/migration80.php 。该迁移指南分为四个部分:
-
新功能
-
向后不兼容变更
-
过时功能
-
其他更改
如果要从 PHP 7.4 以外的版本迁移到 PHP 8.0,还应该查看从当前 PHP 版本到 PHP 8 的所有迁移指南。现在我们来看看迁移过程中的其他推荐步骤。
第 2 步 – 确保当前代码有效
在开始修改当前代码库以确保其在 PHP 8 中正常工作之前,确保代码正常工作绝对是至关重要的。如果代码现在不能工作,那么迁移到 PHP 8 后肯定也不能工作!运行单元测试和黑盒测试,确保代码在当前版本的 PHP 中正常运行。
如果在迁移前对当前代码做了任何更改,请确保这些更改反映在版本控制软件的主分支(通常称为主分支)中。
第 3 步 – 备份所有内容
下一步是备份所有内容。这包括数据库、源代码、JavaScript、CSS、图像等。此外,请不要忘记备份重要的配置文件,如 php.ini
文件、网络服务器配置以及任何其他与 PHP 和网络通信相关的配置文件。
步骤 4 – 创建版本控制分支
在这一步中,你应该在版本控制系统中创建一个新分支,并签出该分支。在主分支中,您应该只有当前能运行的代码。
下面是使用 Git 创建分支的过程:
$ git branch php8_migration
$ git checkout php8_migration
Switched to branch 'php8_migration'
第一条命令创建了一个名为 php8_migration
的分支。第二条命令会让 git
切换到新分支。在此过程中,所有现有代码都会被移植到新分支。主分支现在是安全的,不会受到在新分支中所做改动的影响。
有关使用 Git 进行版本控制的更多信息,请访问: https://git-scm.com/ 。
第 5 步 – 扫描 BC 中断
现在是让 BreakScan
类派上用场的时候了。运行调用程序,并提供项目的起始目录路径和动词强度级别(0、1 或 2)作为参数。您还可以指定 CSV 文件作为第三个选项,如图 11.1 所示。
第 6 步 – 修复不兼容性
在这一步中,知道了故障所在,就可以着手修复不兼容问题。您应该能够做到使代码既能在当前版本的 PHP 中继续运行,又能在 PHP 8 中运行。正如我们在本书中一直指出的那样,BC 中断大多源于不良的编码实践。通过修复不兼容性,同时也改进了代码。
步骤 7 – 根据需要重复步骤 5 和 6
有一句名言,在很多好莱坞电影中都反复出现过,医生对焦虑的病人说,吃两片阿司匹林,明天早上给我打电话。同样的建议也适用于处理 BC 中断的过程。你必须有耐心,继续修复、扫描、修复、扫描。一直这样做,直到扫描结果显示不再有潜在的 BC 断裂。
第 8 步 – 将更改提交到存储库
一旦确信没有其他 BC 中断,就可以将更改提交到在版本控制软件中创建的新 PHP 8 迁移分支。此时继续推送更改。这样,一旦您完成了生产服务器上的 PHP 更新,就可以从该分支中获取更新后的代码。
请记住这一点:您当前的工作代码安全地保存在主分支中。在此阶段,您只是保存到了 PHP 8 迁移分支,因此可以随时切换回来。
步骤 9 – 在模拟虚拟环境中进行测试
把这一步看作是真实环境的彩排。在这一步中,创建一个最接近生产服务器的虚拟环境(例如,使用 Docker
容器)。然后在虚拟环境中安装 PHP 8。创建虚拟环境后,就可以在其中打开命令 shell,并从 PHP 8 移植分支下载源代码。
然后,运行单元测试和其他任何你认为必要的测试,以测试更新后的代码。希望在这里能发现其他错误。
步骤 11 – 在临时环境中安装 PHP 8
下一步是在暂存环境中安装 PHP 8。您可能还记得本章第一部分的讨论,传统的流程是从开发环境到暂存环境,然后再到生产环境。在暂存环境中完成所有测试后,就可以将暂存环境克隆到生产环境中。
PHP 安装在 php.net 主网站上有详尽的文档说明,因此在此无需赘述。本节将简要介绍 PHP 安装,重点是在 PHP 8 和当前 PHP 版本之间切换的能力。
有关在各种环境中安装 PHP 的信息,请参阅此文档页面: https://www.php.net/manual/en/install.php 。 |
为了便于说明,我们选择在 Linux 的两个主要分支上讨论 PHP 8 的安装: Debian/Ubuntu 和 Red Hat/CentOS/Fedora。让我们从 Debian/Ubuntu Linux 开始。
在 Debian/Ubuntu Linux 上安装 PHP 8
安装 PHP 8 的最佳方法是通过可用的预编译二进制文件集。较新的 PHP 版本往往比其发布日期晚得多,PHP 8 也不例外。在这种情况下,建议使用 Personal Package Archive(PPA)。 https://launchpad.net/~ondrej 上的 PPA 是最广泛和最常用的。
如果想在自己的计算机上模拟下面的步骤,请使用此命令运行预装了 PHP 7.4 的 Ubuntu Docker 镜像:
docker run -it \
unlikelysource/ubuntu_focal_with_php_7_4:latest /bin/bash
要在 Debian 或 Ubuntu Linux 上安装 PHP 8,请在生产服务器(或演示容器)上打开一个命令 shell,并以根用户身份执行以下操作。如果没有 root 用户权限,也可以在每个命令前加上 sudo。
从命令 shell 安装 PHP 8 的步骤如下:
-
使用 apt 工具更新和升级当前的软件包。任何软件包管理器都可以使用;不过,为了保持本文所介绍的安装步骤的一致性,我们将展示如何使用 apt:
apt update apt upgrade
-
将
Ondrej
PPA 存储库添加到您的apt
源:add-apt-repository ppa:ondrej/php
-
安装 PHP 8。这只会安装 PHP 8 的核心和基本扩展:
apt install php8.0
-
使用以下命令扫描软件源,查找其他扩展,并根据需要使用
apt
安装它们:apt search php8.0-*
-
进行 PHP 版本检查,确保现在运行的是 PHP 8:
php --version
这是版本检查输出:
root@ec873e16ee93:/# php --version
PHP 8.0.7 (cli) (built: Jun 4 2021 21:26:10) ( NTS )
Copyright (c) The PHP Group
Zend Engine v4.0.7, Copyright (c) Zend Technologies
with Zend OPcache v8.0.7, Copyright (c), by Zend Technologies
现在您已经对 PHP 8 的安装过程有了一个基本概念,让我们来看看如何在当前版本和 PHP 8 之间进行切换。为了便于说明,我们假设 PHP 7.4 是安装 PHP 8 之前的 PHP 版本。
在 Debian 和 Ubuntu Linux 中切换 PHP 版本
如果检查一下 PHP 的位置,就会发现在安装 PHP 8 之后,PHP 7.4(早期版本)仍然存在。您可以使用 whereis php
来查看。模拟 Docker Ubuntu 容器的输出结果如下:
root@ec873e16ee93:/# whereis php
php: /usr/bin/php /usr/bin/php8.0 /usr/bin/php7.4 /usr/lib/php
/etc/php /usr/share/php7.4-opcache /usr/share/php8.0-opcache
/usr/share/php8.0-readline /usr/share/php7.4-readline /usr/
share/php7.4-json /usr/share/php8.0-common /usr/share/php7.4-
common
如您所见,我们现在已经安装了 PHP 7.4 和 8.0 两个版本。要在这两个版本之间切换,请使用以下命令:
update-alternatives --config php
然后,你会看到一个选项屏幕,允许你选择哪个 PHP 版本应处于活动状态。下面是 Ubuntu Docker 映像上的输出界面:
root@ec873e16ee93:/# update-alternatives --config php
There are 2 choices for the alternative php
(providing /usr/bin/php).
Selection Path Priority Status
------------------------------------------------------------
* 0 /usr/bin/php8.0 80 auto mode
1 /usr/bin/php7.4 74 manual mode
2 /usr/bin/php8.0 80 manual mode
Press <enter> to keep the current choice[*], or type selection
number:
切换后,可以再次执行 php --version
来确认另一个 PHP 版本是否有效。
现在让我们把注意力转向在 Red Hat Linux 及其衍生版本上安装 PHP 8。
在 Red Hat、CentOS 或 Fedora Linux 上安装 PHP 8
在 Red Hat、CentOS 或 Fedora Linux 上安装 PHP 所使用的一系列命令与 Debian/Ubuntu 的安装程序类似。主要区别在于,你很可能会结合使用 dnf 和 yum 来安装预编译的 PHP 二进制文件。
如果您想按照我们在本节中概述的方法安装,可以使用已经安装了 PHP 7.4 的 Fedora Docker 容器。下面是运行模拟的命令:
docker run -it unlikelysource/fedora_34_with_php_7_4 /bin/bash
与上一节描述的 PPA 环境类似,在红帽世界中,Remi’s RPM Repository 项目 (http://rpms.remirepo.net/) 以红帽软件包管理(RPM)格式提供预编译的二进制文件。
要在 Red Hat、CentOS 或 Fedora 上安装 PHP 8,请在生产服务器(或演示环境)上打开命令 shell,并以 root 用户身份执行以下操作:
-
首先,最好确认一下正在使用的操作系统版本和发行版。为此,可以使用
uname
命令和简单的cat
命令来查看版本(以文本文件形式保存在/etc
目录中):[root@9d4e8c93d7b6 /]# uname -a Linux 9d4e8c93d7b6 5.8.0-55-generic #62~20.04.1-Ubuntu SMP Wed Jun 2 08:55:04 UTC 2021 x86_64 x86_64 x86_64 GNU/Linux [root@9d4e8c93d7b6 /]# cat /etc/fedora-release Fedora release 34 (Thirty Four)
-
在开始之前,请务必更新
dnf
并安装配置管理器:dnf upgrade dnf install 'dnf-command(config-manager)'
-
然后,你就可以将 Remi 的软件源添加到你的软件包源中,用你喜欢的版本号代替 NN:
dnf install https://rpms.remirepo.net/fedora/remi-release-NN.rpm
-
此时,可以使用
dnf module list
确认已安装的 PHP 版本。我们还可以使用grep
将显示的模块列表限定为 PHP。[e]
表示已启用:[root@56b9fbf499d6 /]# dnf module list |grep php php remi-7.4 [e] common [d] [i], devel, minimal PHP scripting language php remi-8.0 common [d], devel, minimal PHP scripting language
-
然后,我们检查 PHP 的当前版本:
[root@d044cbe477c8 /]# php --version PHP 7.4.20 (cli) (built: Jun 1 2021 15:41:56) (NTS) Copyright (c) The PHP Group Zend Engine v3.4.0, Copyright (c) Zend Technologies
-
接下来,我们重置 PHP 模块,并安装 PHP 8:
dnf -y module reset php dnf -y module install php:remi-8.0
-
另一个快速的 PHP 版本检查显示,我们现在使用的是 PHP 8,而不是 PHP 7:
[root@56b9fbf499d6 /]# php -v PHP 8.0.7 (cli) (built: Jun 1 2021 18:43:05) ( NTS gcc x86_64 ) Copyright (c) The PHP Group Zend Engine v4.0.7, Copyright (c) Zend Technologies
-
要切换回早期版本的 PHP,请按以下步骤操作,其中
X.Y
是您计划使用的版本:dnf -y module reset php dnf -y module install php:remi-X.Y
至此,Red Hat、CentOS 或 Fedora 的 PHP 安装说明就完成了。在本演示中,我们只向你展示了 PHP 的命令行安装。如果计划在 Web 服务器中使用 PHP,还需要安装相应的 PHP Web 服务器软件包,和/或安装 PHP-FPM(FastCGI 处理模块)软件包。
现在让我们看看最后一步。