分四步切换到 PHP 8.x——Juliette Reinders Folmer 访谈
已发表: 2023-03-04将 WordPress 站点、插件或主题升级到新版本的 PHP 是一项定期执行的任务。 但是如何尽可能高效地做到这一点呢? 你怎么知道你不会忽略任何事情? 有路线图吗?
在本文中,我们将解决这些问题(以及更多问题),并了解为您的 WordPress 网站、插件或主题平稳过渡到 PHP 8.x 所涉及的内容,包括路线图。
我们将根据对 PHP 专家 Juliette Reinders Folmer 的采访来进行此操作。 她将日常生活的大部分时间都投入到编程和与之相关的一切中,主要关注开源项目,包括 WordPress。
你也准备好顺利切换了吗? 对我们的分步计划感到好奇吗? 那么让我们开始吧!
PHP 8.x——改变了什么
有关更改的概述,我们推荐以下文章:
- PHP 8.0 和 PHP 8.1 的发行说明
- PHP 8.0 和 PHP 8.1 迁移指南
- WordPress 和 PHP 8.0 以及当前状态
- PHP 8.0 和 PHP 8.1 的新特性
阅读这些文章后,您将完全了解 PHP 8.x 中发生的变化以及您需要做些什么才能让您的 PHP 项目顺利运行。
如果您不确定最好的开始方式是什么,没问题。 在与 Juliette 的对话中,我们详细讨论了这一点,我们将在本文中尽可能完整地向您解释如何切换到 PHP 8.x。
我们还将在信息框中说明如何在 MyKinsta 中执行各种操作,MyKinsta 是我们为您的所有 WordPress 网站、应用程序和数据库提供的专有控制面板。
切换到 PHP 8.x:如何开始
切换到 PHP 8.x 听起来很简单,从技术上讲确实如此。 许多主机允许您在管理面板中指定要为您的网站使用的 PHP 版本。 在 Kinsta,只需在 MyKinsta 仪表板中单击一下即可切换 PHP 版本。
但在此之前,您需要确定一些事项。 根据您的知识和经验水平,我们建议如下:
- 如果您使用标准主题和插件构建了自己的 WordPress 网站,但对 PHP 了解不多,请聘请开发人员或机构调查您的网站是否适合在 PHP 8.x 上运行。 您是否正在寻找可以帮助您解决此问题的第三方? 然后查看我们的合作伙伴页面,其中列出了几家可以为您提供帮助的值得信赖的公司。
- 如果您的 WordPress 网站是由外部方、开发人员或代理机构构建的,请联系他们询问您的网站是否可以在 PHP 8.x 上运行。
- 如果您已经构建了您的 WordPress 网站——例如,使用您自己的自定义主题或自行开发的插件——我们在下面为您提供了路线图。
如果您的站点属于前两个类别之一,我们当然会邀请您通读本文的其余部分,但我们不建议您开始自行测试站点的 PHP 8 兼容性。 交给专业人士吧。
无论您选择什么,我们都建议您不要只是将您的实时网站切换到 PHP 8 并“看看它是否有效”。 您是否对您的网站的外观感到好奇,并且迫不及待地想看到它在 PHP 8 上运行? 然后开始在暂存环境中进行测试。 一个好的主机可以让你轻松搭建一个暂存环境。
在暂存环境中,您可以激活 PHP 8.x 并查看此更新是否适用于您的站点。 也可以使用您站点的本地副本。 使用我们免费的 DevKinsta 开发工具,您可以轻松地从 MyKinsta 仪表板导入您的网站,之后您可以将 PHP 版本更改为 8.0 或 8.1。
如果您在暂存环境中没有看到任何问题,并不一定意味着实际上没有任何问题。 下面的路线图将告诉您原因。
PHP 8.x 兼容性测试:路线图
测试:好软件的关键词。 即使对于 WordPress 网站及其组件(如主题、插件和 WordPress 核心),测试也是确保您不想发生的事情不会发生的手段。
软件开发项目主要由测试组成。 在本文中,我们将专门研究可帮助您顺利过渡到 PHP 8.x 的测试。 在我们关于 DevOps 工具的文章中,您会找到一个包含您可以使用的工具集合的部分。
这篇博文讨论了以下类型的测试:
让我们更仔细地看看我们可以执行的不同类型的测试。
静态分析(或静态测试)
作为 PHP 开发人员,您可以采取的第一步是使用各种工具对您的代码执行静态分析。 静态分析是在不执行代码的情况下分析软件的过程。 通过静态分析,可以检测错误、检测 PHP 8.x 兼容性问题、执行编码标准(例如 WordPress 编码标准),甚至可以修改和清理代码。
静态分析工具
您可以使用各种工具执行静态分析,例如:
- PHP兼容性
- 诗篇
- PHP斯坦
在撰写本文时,并非所有 PHP 8.1 检查都在最新的 PHPCompatibility 版本中得到支持。 PHP 8.1 检查可以在开发版本中进行,因此请确保在使用 PHPCompatibility 分析项目并查看存在哪些错误/建议时(暂时)使用这些检查。
PHP 8.1 检查将很快在新的主要版本中发布。 如果您想了解最新信息,并且您有 GitHub 帐户,请打开 PHPCompatibility 的 GitHub 存储库并导航至Watch -> Custom -> Releases ,您可以在其中选择在发布新版本时收到通知。
PHPCompatibility 仅测试特定版本(或版本范围)的 PHP 的兼容性,易于设置。 如果您在 PHPCompatibility 中运行 testVersion,例如 8.0+(8.0 及更高版本),您将获得最佳结果。
您应该留意已弃用或已删除的函数、已更改的函数参数默认值、是否使用不带括号的 concat、是否使用 match 作为函数名称(因为自 PHP 8.0 以来它已被保留)等。
Psalm 和 PHPStan 是很好的补充,可以通过执行与变量类型相关的额外检查来帮助您。 这些工具的缺点是需要大量配置才能获取有关 PHP 8.0 和 8.1 的报告。 即使他们成功了,您也可能会遇到许多误报。 误报是由于静态分析的局限性而错误给出的通知。
正确解释这两个工具的结果需要扎实的知识,但这些知识可以帮助您识别 PHPCompatibility 无法发现的其他不兼容性。 如果您想了解更多信息,请查看 Psalm 和 PHPStan 的文档。
概括:
- 使用 PHPCompatibility、Psalm、PHPStan 执行静态分析
- 解决所有合法问题
单元测试
该过程的下一步是单元测试。 单元测试是一种单独测试代码片段的方法。 在单元测试中,将为每个单元开发特定的目标测试。 这将涉及运行不同的场景。 优选地,每个场景都与其他场景分开测试,以便测试彼此独立。
当然,只有单元测试是不够的。 它们也需要运行。 单元测试最好使用 CI(持续集成)工具(例如 Jenkins、GitHub Actions 或 Travis)实现自动化。
支持多个版本的 PHP
作为插件构建器,如果你想支持多个 PHP 版本,请确保 CI 中的测试针对你支持的所有 PHP 版本运行。
当然,你也可以只支持较新的版本,选择完全取决于你。
使用多个 PHP 版本进行测试需要您使用多个 PHPUnit 版本,具体取决于 PHP 版本。 由于 PHPUnit 多年来引入了一些影响测试编写方式的更改,因此这部分可能很棘手。
要解决这个问题,您可以使用 PHPUnit Polyfills(由 Juliette 编写并由 Yoast 赞助)。 这使您可以编写 PHPUnit 9 官方不支持的测试(因此可以在 PHP 8.x 上运行)。 然后,Polyfill 使您的测试在 PHPUnit 4.x 到 9.x 以及 PHP 5.4 到 PHP 8.1 中工作(截至目前)。[/notice]
现在您已经运行了测试,下一步是确保修复测试中发现的问题。
代码覆盖率
运行这些测试是发现跨版本不兼容性的最可靠方法。
这样做时,请注意测试的代码覆盖率:
- 假设您有一个函数 A 并为它编写了测试,并且函数 A 调用函数 B、C 和 D 作为函数中逻辑的一部分。
- 函数A的测试是为了测试函数A的逻辑而写的,但是在测试的时候也会调用函数B、C、D。 对于函数 B、C 和 D,您通常只测试“快乐路径”——一切顺利的情况——因此,这些函数也还没有完全测试,尽管这些函数中的(部分)代码是在功能 A 的测试期间执行。
- 对于您的每个测试,请指出具体测试的代码。 你可以通过给每个测试一个@covers 来做到这一点。这样,B、C 和 D 就不会被“计算”在代码覆盖率计算中,这样你就可以看到你的代码的哪一部分被测试覆盖了。
开发人员经常编写和测试——有时甚至是在不知不觉中——为了“快乐之路”。 在这些情况下,还需要测试将意外数据传递给函数时会发生什么。 仅使用预期值/类型进行测试是不够的。
上面引述的第二部分经常被遗忘,而它可能比第一部分更重要。 如果传递的类型不正确会怎样? 你收到错误信息了吗? 还是带有函数的变量继续正常运行? 如果将意外值传递给函数怎么办?
请务必使用意外变量、类型和值测试您的函数。 只有这样,您才能依靠您的测试来发现新的 PHP 版本可能导致的问题。
PHP 越来越严格
PHP 在处理 PHP 自身函数的“类型”以及动态属性等方面变得更加精确(严格)。 这些更改通常旨在帮助开发人员交付无错误代码(嗯,错误更少的代码)。 但这可能会给基于 PHP“旧”原则编写的现有代码带来相当大的升级障碍。
由于在 PHP 中需要更多有用的错误消息,您可以看到使现有代码适合新的 PHP 版本需要越来越多的时间。 与升级代码以使其适用于 PHP 8.1 相比,在大多数情况下,使适用于 PHP 5.6 的代码适用于 PHP 7.0 只花费了一小部分时间。 尽管事实上 PHP 7.0 是“主要”版本,而 PHP 8.1 是“次要”版本。
在许多情况下,测试仍然是确定需要修改哪些内容以支持新版本的唯一可靠方法。
可以使用各种工具进行单元测试,包括:
- PHP单元
- 嘲讽
- 行为,
- 故事播放器
许多这些工具都是基于 PHPUnit 构建的,或者与 PHPUnit 结合使用。
最终,使用什么工具并不重要。 最重要的是您进行测试,并让测试在新的 PHP 版本上运行。 这个步骤有时会非常棘手,但幸运的是,如前所述,有用于此的工具,例如 PHPUnit Polyfills。
集成测试
集成测试是我们将在静态分析和单元测试之后执行的下一步。 集成测试是在更大的上下文中测试现实生活情况,而不仅仅是“代码单元”。 这些包括使用活动(测试)数据库进行测试或使用外部 API 进行测试,仅举两个示例。
因此,当您在 WordPress 上下文中测试插件或主题的代码并使用真实版本时,根据定义,这些都是集成测试。
WP Test Utils(同样由 Juliette 编写并由 Yoast 赞助)是一个优秀的集成测试工具。 WP Test Utils 提供编写集成和单元测试的工具,其中使用 Brainmonkey 和 Mockery“模拟”WordPress,其中“伪造”常用的 WordPress 功能,以便您测试自己的代码而不是 WordPress 代码。
与 WordPress 的集成测试是一个更棘手的故事,因为它涉及与 WordPress 和 WordPress 的测试套件的集成。 根据插件或主题支持的 WordPress 版本,您必须考虑 WordPress 本身支持哪些 PHPUnit 版本以在不同的 PHP 版本上运行测试。
例如,WordPress 5.6 到 5.8 使用 PHPUnit 5 到 7 来测试 PHP 5.6 到 PHP 8.0,但从 WordPress 5.9 开始,WordPress 本身也使用 PHPUnit Polyfills 以获得更广泛的支持。 WP Test Utils 充当克服所有这些差异的桥梁。
想详细了解如何针对多个不同版本的 WordPress(包括 WordPress 5.9 及更高版本)运行集成测试? 然后在 WordPress 的网站上阅读它。
手动测试
现在您已经完成了单元测试和集成测试并修复了您发现的所有问题,是时候进行手动测试了。 您的站点正在运行,并且您自己的代码正在运行,但您还使用了插件 A、B 和 C。您知道这些插件是否兼容吗?
例如,与插件的作者核实一下,看看他们是否表明它与 PHP 8.x 兼容。 当然,接下来的问题是如何测试插件。 这里的答案通常是:孤立地。 该插件的功能通常在没有其他活动插件的情况下单独与 WordPress 一起进行测试。 即使在这些测试中使用了其他插件,也有可能并非您使用的所有插件都在测试中,因此对这样的兼容性声明持保留态度。
例如,具有 3 个插件(A、B 和 C)的 WordPress 站点。 例如,插件 B 可能通过过滤器返回错误的变量类型,而使用相同过滤器的插件 C 想要使用该过滤器。 这可能会导致致命错误,因为类型不再是预期的类型。 插件 C 然后被视为错误消息的罪魁祸首,即使插件 B 才是真正的罪魁祸首。
插件互操作性——在孤立测试时不可能发现不兼容性。 插件越活跃,出错的可能性就越大。 例如,将页面请求从实时网站传递到暂存环境(启用错误日志记录)以发现实际出了什么问题是非常有益的。
对于此类问题,网站所有者通常只会看到一条消息,指出上次执行的代码(在本例中,来自插件 C)有错误,即使插件 C 不一定是问题的原因。
在大多数情况下,涉及大量手动、人工工作,并且需要大量的肘部润滑脂来检测和修复这些问题。 这可以使用端到端测试自动进行,但我们没有看到这种情况在 WordPress 中发生太多。
测试使用插件的可用性
对于开发人员和开发团队:仅在测试可用时才接受代码。 通过这种方式,您可以确保需要更少的手动测试,从而节省大量时间。
如果您想购买商业插件或主题,请质疑其测试策略。 这样,我们就可以在 WordPress 社区的开发人员/开发团队中共同提高意识,将测试提上议事日程,我们都将从中受益。
测试通常被不公平地视为一种成本,而实际上它可以节省资金。 编写测试所需的额外投资以大大减少错误报告和修复错误所花费的时间的形式得到回报。 此外,通过自动化软件测试,可以更快地完成扩展和修改,因为测试可以快速确认现有功能是否继续工作。
WordPress 主机和 PHP 8.x 的作用
对于普通站点所有者,非常需要来自主机的指导。 考虑以下:
- 针对 WordPress 核心、插件和/或主题(在某些情况下)与 PHP 跨版本不兼容的客户的文档和更新
- 测试选项(例如使用暂存环境)
- 错误报告和联系支持的方法
这也有利于网络主机,因为网站所有者经常在出现问题时联系主机寻求帮助。 在切换到 PHP 8.0 或 8.1 的情况下,站点所有者应对潜在问题负责,并且所有者为正确准备切换所需的信息越多越好。
将 PHP 8.0 或 8.1 作为 Web 主机提供给客户是一回事,但在这样做时,他们必须确保在客户中建立意识,以便他们意识到可能会出现问题。 建议在与实时版本不同的临时环境中测试您的站点。 (在 Kinsta 默认情况下可以选择 PHP 版本。)
WordPress 的最低 PHP 版本
目前,超过 15% 的网站使用 PHP 7.0 或更低版本。 这可以在官方的 WordPress 统计数据中看到。 大约 83% 的 WordPress 网站目前使用 PHP 7.4 或更低版本。 请注意,PHP 目前不再支持任何低于或等于 7.4 的版本。 使用生命周期结束的 PHP 版本可能会导致问题,因为不再发布安全更新。
为避免出现问题,重要的是 WordPress 网站所有者了解并告知允许其网站安全运行的最低 PHP 版本。 就他们而言,站点所有者可以自己修改 PHP 版本(可以在 Kinsta 上修改所有软件包)或要求他们的主机将站点更新为较新的 PHP 版本。 在极端情况下,您可以切换到支持这些较新版本的主机。
因为WordPress只要求7.4的最低版本,所以很多主机和站主更新站点的动力不足。 尽管事实上 PHP 7.4 已于 2022 年 11 月结束。
如果 WordPress 确实增加了最低 PHP 版本,这可能意味着许多网站将不再与最新 WordPress 版本的更新兼容。 但是,在相当长的一段时间内,将继续为那些过时的版本发布安全更新。
概括
要为您的网站切换到 PHP 8.0 或更高版本,您或您的开发人员必须执行几个步骤。 重要步骤包括:
- 静态分析
- 单元测试
- 集成测试
- 手动测试
切换到 PHP 8.x 时,请确保所有内容都经过正确测试。 这是保证您的站点在较新的 PHP 版本上正常、快速和安全运行的唯一方法。
我们非常感谢 Juliette 参与本文以及她在提到的工具上所做的所有工作!
朱丽叶的照片,由 Jip Moors 拍摄并经许可使用。