升级服务器PHP版本至8.x的四个步骤

升级服务器PHP版本至8.x的四个步骤

将一个WordPress站点、插件或主题升级到新的PHP版本是一项经常出现的任务。但是,如何尽可能有效地做到这一点?你怎么知道你不会忽略任何东西?是否有一个路线图?

在这篇文章中,我们将解决这些问题(以及更多),并看看为你的WordPress网站、插件或主题顺利过渡到PHP 8.x所涉及的内容。

PHP 8.x – 有何变化

关于这些变化的概述,我们推荐下面的文章:

读完这些文章后,你将完全了解到PHP 8.x的变化以及你需要做什么来使你的PHP项目顺利运行。

如果你不确定什么是最好的开始,没问题。我们将在本文中尽可能全面地向你解释如何切换到PHP 8.x。

切换到PHP 8.x:如何开始

切换到 PHP 8.x 听起来很简单,技术上也是如此。许多主机允许你在管理面板中指定你的网站要使用哪个版本的PHP。

但在这之前,有一些事情你需要确定一下。根据你的知识和经验水平,我们建议如下。

  • 如果你已经用标准的主题和插件建立了自己的WordPress网站,而没有太多的PHP知识,请聘请一个开发人员或机构来调查你的网站是否适合运行在PHP 8.x上。你是否在寻找一个可以帮助你的第三方?那么请看我们的合作伙伴页面,上面列出了几个值得信赖的公司可以帮助你。
  • 如果你的WordPress站点是由外部机构、开发商或代理公司建立的,请联系他们询问你的站点是否能运行在PHP 8.x上。
  • 如果你已经建立了你的WordPress站点–例如用你自己的定制主题,或自行开发的插件–我们在下面为你提供了一个路线图。

如果你的网站属于前两类中的一类,我们当然邀请你阅读文章的其余部分,但我们不建议你自己开始测试网站的PHP 8兼容性。把它留给专业人士吧。

无论你选择什么,我们都建议你不要只是把你的实时站点切换到PHP 8,然后 “看看它是否工作”。你是否对你的网站会是什么样子感到好奇,并迫不及待地想看到它在 PHP 8 上运行?那就在一个暂存环境中开始测试。一个好的主机将允许你轻松地建立一个暂存环境。

如果你在暂存环境中没有看到任何问题,这并不一定意味着实际上没有任何问题。下面的路线图将告诉你原因。

PHP 8.x兼容性测试

测试:好软件的关键词。即使是WordPress网站及其组件,如主题、插件和WordPress核心,测试也是确保不发生你不希望发生的事情的手段。

一个软件开发项目主要由测试组成。在这篇文章中,我们特别看一下可以帮助你顺利过渡到PHP 8.x的测试。

在这篇博文中讨论了以下类型的测试:

  1. Static Analysis (or Static Testing)
  2. Unit Testing
  3. Integration Testing
  4. Manual Testing

让我们更仔细地看一下我们可以进行的不同类型的测试。

Static Analysis (or Static Testing)

作为一个PHP开发者,你可以采取的第一步是用各种工具对你的代码进行静态分析。静态分析是在不执行代码的情况下分析软件的过程。通过静态分析,可以发现错误,发现与PHP 8.x的兼容性问题,执行编码标准(例如,WordPress编码标准),甚至修改和清理代码也是可能的。

Tools for Static Analysis

你可以用各种工具进行静态分析,如:

在写这篇文章的时候,并不是所有的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开始被保留),等等。

来自PHPCompatibility GitHub页面的屏幕截图

来自PHPCompatibility GitHub页面的屏幕截图

Psalm 和 PHPStan 是很好的补充,可以通过执行与变量类型相关的额外检查来帮助你。这些工具的缺点是需要大量的配置才能在 PHP 8.0 和 8.1 上获得报告。即使它们是成功的,也会有许多误报。假阳性是指由于静态分析的局限性而错误地给出的通知。

要正确解释这两个工具的结果,需要健全的知识,但这些知识可以帮助你识别PHPCompatibility无法发现的其他不兼容情况。如果你想了解更多关于Psalm和PHPStan的信息,请看它们的文档。

总结:

  • 用PHPCompatibility, Psalm, PHPStan进行静态分析
  • 解决所有合法问题

Juliette专家的建议

在测试时,在你的 php.ini / wp-config.php 文件中,将 error_reporting 设置为 -1。这是因为E_ALL,取决于PHP版本,并不包含所有内容。

只有从8.0开始,E_ALL才包含所有内容。另外,打开 log_errors,在日志文件中回看通知。

不要在实时网站上打开错误日志,因为这可能导致延迟,因为它需要将数据写入文件。因此,在一个暂存环境中做这个,并确保你知道发生了什么/失误。

单元测试

过程中的下一步是单元测试。单元测试是一种单独测试代码片段的方法。在单元测试中,将为每个单元开发特定的目标测试。这将涉及到运行不同的场景。最好是将每个场景与其他场景分开测试,这样测试就可以相互独立。

当然,光有单元测试是不够的。它们还需要被运行。单元测试最好使用CI(持续集成)工具,如JenkinsGitHub ActionsTravis进行自动化。

来自GitHub Actions的一个例子

来自GitHub Actions的一个例子

支持多版本的PHP

作为一个插件构建者,如果你想支持多个PHP版本,请确保CI中的测试是针对你支持的所有PHP版本运行的。

当然,你也可以只支持较新的版本,这个选择完全取决于你。

Juliette专家建议

在 GitHub Actions 上,已经可以针对 PHP 8.2 进行测试,这将确保及时得到需要考虑的 PHP 新变化的警告。

用多个版本的 PHP 进行测试需要使用多个 PHPUnit 版本,这取决于 PHP 版本。由于 PHPUnit 多年来引入了一些影响测试编写方式的变化,这部分可能比较棘手。

为了解决这个问题,你可以使用PHPUnit Polyfills(由Juliette编写并由Yoast赞助)。这可以让你编写官方不支持PHPUnit 9的测试(因此可以在PHP 8.x上运行)。然后Polyfills使你的测试在PHPUnit 4.x到9.x以及PHP 5.4到PHP 8.1(截至目前)中运行。

现在你已经运行了测试,下一步是确保测试中发现的问题被修复。

代码覆盖率

运行这些测试是发现跨版本不兼容的最可靠方法。

在这样做的时候,请注意你的测试的代码覆盖率:

  • 假设你有一个函数A,并为它写了一个测试,函数A调用函数B、C和D作为函数中逻辑的一部分。
  • 对函数A的测试是为了测试函数A的逻辑,但在测试中也会调用函数B、C和D。对于函数B、C和D,你通常只测试 “快乐的路径”–一切顺利的情况–因此,这些函数也还没有完全测试,尽管这些函数中的(部分)代码在函数A的测试中被执行。
  • 对于你的每一个测试,指出哪些代码是具体被测试的。这样,B、C和D就不会被 “计算” 在代码覆盖率的计算中,这使你可以看到你的代码有哪一部分被测试所覆盖。

通常情况下,开发人员编写和测试–有时甚至是在不知不觉中–是为了 “快乐的路径”。在这些情况下,测试当意外的数据被传递给一个函数时会发生什么也是必要的。只用预期值/类型进行测试是不够的

上面这句话的第二部分经常被遗忘,而它也许比第一部分更重要。如果你传递一个不正确的类型,会发生什么?你会得到一个错误信息吗?还是变量与函数一起继续正常地投递?如果向函数传递了一个意想不到的值会怎样?

一定要用意外的变量、类型和值来测试你的函数。只有这样才能依靠你的测试来发现新的PHP版本可能引起的问题。

PHP正在变得更加严格

在如何处理 PHP 自己的函数的 “类型 “以及像动态属性这样的东西方面,PHP 正在变得更加精确(严格)。这些变化通常是为了帮助开发人员提供无错误的代码(好吧,就是错误少的代码)。但这对基于 “旧 “的PHP原则编写的现有代码来说,是一个很大的升级障碍。

由于这种在 PHP 中寻求更有帮助的错误信息的驱动力,你可以看到使现有的代码适合新的 PHP 版本需要越来越多的时间。使在 PHP 5.6 上运行的代码适用于 PHP 7.0,与升级代码使其适用于 PHP 8.1 相比,在大多数情况下只需花费很小的时间。尽管PHP 7.0是一个 “大 “版本,而PHP 8.1是一个 “小 “版本。

在很多情况下,测试仍然是确定需要修改什么以支持新版本的唯一可靠方法。

单元测试可以通过各种工具进行,包括:

这些工具中的许多都是基于或结合PHPUnit而建立的。

归根结底,使用什么工具并不重要。最重要的是你要测试,并让测试在新的PHP版本上运行。这一步有时会很麻烦,但幸运的是,正如前面提到的,有一些工具可以做到这一点,比如PHPUnit Polyfills

集成测试

集成测试是在静态分析和单元测试之后,我们要进行的下一步工作。集成测试是在更大的范围内测试真实情况,而不仅仅是一个 “代码单元”。这包括与活动(测试)数据库的测试或与外部API的测试,仅举两个例子。

所以,当你在WordPress的背景下测试一个插件或主题的代码,并使用一个真实的版本,根据定义,这些是集成测试。

WP Test Utils(同样由Juliette编写,由Yoast赞助)是一个优秀的集成测试工具。WP Test Utils提供了编写集成和单元测试的工具,其中WordPress是用BrainmonkeyMockery “模拟 “出来的,其中常用的WordPress函数是 “假的”,这样你就在测试你自己的代码而不是WordPress的代码。

GitHub上的WP测试工具

GitHub上的WP测试工具

与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一起测试的,没有其他活跃的插件。而且,即使在这些测试中使用了其他的插件,也有可能不是所有你使用的插件都是测试的一部分,所以对这样的兼容性声明要多加注意。

例如,一个WordPress网站有3个插件(A、B和C)。例如,插件B有可能通过一个过滤器返回一个不正确的变量类型,而插件C使用同样的过滤器,想要与之合作。这可能会导致一个致命的错误,因为该类型不再是预期的。插件C就会被看作是错误信息的罪魁祸首,尽管插件B才是真正的罪犯。

插件的互操作性-不相容性在单独测试时是不可能发现的。活跃的插件越多,就越有可能出错。例如,将页面请求从一个实时网站传递到一个暂存环境(启用错误记录),以发现实际出错的地方,这将是非常有益的。

对于这种类型的问题,网站所有者通常只会看到最后执行的代码有错误的信息(在这种情况下,来自插件C),尽管插件C不一定是问题的原因。

在大多数情况下,涉及到大量的人工工作,并且需要大量的精力来检测和修复这些问题。这可以通过端到端测试来实现自动化,但我们在WordPress中并没有看到这种情况。

测试使用的插件的可用性

对于开发者和开发团队。只有在有测试的情况下才接受代码。这样,你可以确保减少人工测试,从而节省大量的时间。

如果你想购买一个商业插件或主题,请质疑其测试策略。这样,我们共同在WordPress社区的开发者/开发团队中建立起意识,让测试在议程上占据更高的位置,而我们都会受益。

测试经常被视为–不公平地–是一种成本,而实际上,它可以省钱。编写测试所需的额外投资以大大减少错误报告和减少修复错误的时间的形式得到回报。此外,通过自动化软件测试,扩展和修改可以更快完成,因为测试可以迅速确认现有功能继续工作。

Juliette专家建议

当你想开始写新的代码时:

  1. 首先写出一个函数应该做什么,用什么逻辑。把它写成注释或一系列的注释。
  2. 编写测试。试着把边缘情况也考虑进去。
  3. 然后才写代码。

在你在评论中描述的原始逻辑中,有一半会消失,因为它已经被代码所取代。留下其余的评论,因为如果你有一段时间没有看你的代码,它们可以帮助你以后再次理解逻辑。

WordPress主机和PHP 8.x的作用

对于普通的网站所有者来说,来自你的主机的指导是非常可取的。请考虑以下几点:

  • 为客户提供WordPress Core、插件和/或主题(在某些情况下)不兼容PHP跨版本的文档和更新
  • 测试的选项(如暂存环境)。
  • 报告错误和联系支持的方法

这对虚拟主机也有好处,因为当问题出现时,网站所有者通常会联系主机寻求帮助。在切换到 PHP 8.0 或 8.1 的情况下,网站所有者要对潜在的问题负责,所有者有越多的信息来为切换做适当的准备,就越好。

作为虚拟主机,向客户提供 PHP 8.0 或 8.1 是一件事,但在这样做的时候,他们必须确保在客户中建立起意识,让他们意识到问题可能会浮现。建议在暂存环境中用与实时不同的版本测试你的网站。

WordPress的最小PHP版本

目前有超过15%的网站使用PHP7.0或更低的版本。这可以在WordPress的官方统计中看到。大约83%的WordPress网站目前使用PHP 7.4或更低的版本。请注意,任何低于或等于7.4版本的东西目前都不再被PHP支持。使用报废的PHP版本会导致问题,因为安全更新已经不再发布。

为了避免问题,重要的是WordPress的站长们知道并了解能让他们的网站安全运行的最小PHP版本。就他们而言,网站所有者可以自己修改PHP版本或要求他们的主机将网站更新到一个较新的PHP版本。在极端情况下,你可以切换到支持这些较新版本的主机。

因为WordPress只需要7.4的最低版本,所以很多主机商和网站所有者没有足够的动力去更新他们的网站。而这是尽管PHP7.4在2022年11月达到了它的寿命终点。

如果WordPress真的提高了最低PHP版本,这可能意味着许多网站将不再兼容更新到最新的WordPress版本。然而,在相当长的一段时间内,安全更新将继续为那些过时的版本发布。

小结

要为网站切换到 PHP 8.0 或更高版本,您或您的开发人员必须执行几个步骤。重要的步骤包括:

  • 静态分析
  • 单元测试
  • 集成测试
  • 手动测试

当转换到 PHP 8.x 时,要确保所有的东西都已经过正确的测试。这是保证你的网站在较新的PHP版本上正确、快速、安全地运行的唯一方法。

评论留言