
将一个WordPress站点、插件或主题升级到新的PHP版本是一项经常出现的任务。但是,如何尽可能有效地做到这一点?你怎么知道你不会忽略任何东西?是否有一个路线图?
在这篇文章中,我们将解决这些问题(以及更多),并看看为你的WordPress网站、插件或主题顺利过渡到PHP 8.x所涉及的内容。
关于这些变化的概述,我们推荐下面的文章:
读完这些文章后,你将完全了解到PHP 8.x的变化以及你需要做什么来使你的PHP项目顺利运行。
如果你不确定什么是更好的开始,没问题。我们将在本文中尽可能全面地向你解释如何切换到PHP 8.x。
切换到 PHP 8.x 听起来很简单,技术上也是如此。许多主机允许你在管理面板中指定你的网站要使用哪个版本的PHP。
但在这之前,有一些事情你需要确定一下。根据你的知识和经验水平,我们建议如下。
如果你的网站属于前两类中的一类,我们当然邀请你阅读文章的其余部分,但我们不建议你自己开始测试网站的PHP 8兼容性。把它留给专业人士吧。
无论你选择什么,我们都建议你不要只是把你的实时站点切换到PHP 8,然后 “看看它是否工作”。你是否对你的网站会是什么样子感到好奇,并迫不及待地想看到它在 PHP 8 上运行?那就在一个暂存环境中开始测试。一个好的主机将允许你轻松地建立一个暂存环境。
如果你在暂存环境中没有看到任何问题,这并不一定意味着实际上没有任何问题。下面的路线图将告诉你原因。
测试:好软件的关键词。即使是WordPress网站及其组件,如主题、插件和WordPress核心,测试也是确保不发生你不希望发生的事情的手段。
一个软件开发项目主要由测试组成。在这篇文章中,我们特别看一下可以帮助你顺利过渡到PHP 8.x的测试。
在这篇博文中讨论了以下类型的测试:
让我们更仔细地看一下我们可以进行的不同类型的测试。
作为一个PHP开发者,你可以采取的之一步是用各种工具对你的代码进行静态分析。静态分析是在不执行代码的情况下分析软件的过程。通过静态分析,可以发现错误,发现与PHP 8.x的兼容性问题,执行编码标准(例如,),甚至修改和清理代码也是可能的。
Tools for Static Analysis
你可以用各种工具进行静态分析,如:
在写这篇文章的时候,并不是所有的PHP 8.1检查都在最新的PHPCompatibility版本中被支持。PHP 8.1检查可以在开发版本中出现,所以在使用PHPCompatibility分析你的项目并查看有哪些错误/建议时,请确保使用那些(目前)。
PHP 8.1检查将很快在一个新的主要版本中发布。如果你想了解这方面的最新情况,并且你有GitHub账户,请打开,导航到Watch -> Custom -> Releases,你可以选择在新版本发布时得到通知。
PHPCompatibility只测试某个特定版本(或版本范围)的PHP的兼容性,它很容易设置。如果在 PHPCompatibility 中运行一个 –例如 8.0+(8.0 及以上),可以得到更好的结果。
你应该注意被废弃或删除的函数,改变了的函数参数的默认值,是否使用不带括号的concat,是否使用match作为函数名(因为它从PHP 8.0开始被保留),等等。

来自PHPCompatibility GitHub页面的屏幕截图
Psalm 和 PHPStan 是很好的补充,可以通过执行与变量类型相关的额外检查来帮助你。这些工具的缺点是需要大量的配置才能在 PHP 8.0 和 8.1 上获得报告。即使它们是成功的,也会有许多误报。假阳性是指由于静态分析的局限性而错误地给出的通知。
要正确解释这两个工具的结果,需要健全的知识,但这些知识可以帮助你识别PHPCompatibility无法发现的其他不兼容情况。如果你想了解更多关于Psalm和PHPStan的信息,请看它们的文档。
总结:
Juliette专家的建议
在测试时,在你的 php.ini / wp-config.php 文件中,将 error_reporting 设置为 -1。这是因为E_ALL,取决于PHP版本,并不包含所有内容。
只有从8.0开始,E_ALL才包含所有内容。另外,打开 log_errors,在日志文件中回看通知。
不要在实时网站上打开错误日志,因为这可能导致延迟,因为它需要将数据写入文件。因此,在一个暂存环境中做这个,并确保你知道发生了什么/失误。
过程中的下一步是单元测试。单元测试是一种单独测试代码片段的 *** 。在单元测试中,将为每个单元开发特定的目标测试。这将涉及到运行不同的场景。更好是将每个场景与其他场景分开测试,这样测试就可以相互独立。
当然,光有单元测试是不够的。它们还需要被运行。单元测试更好使用CI(持续集成)工具,如、或进行自动化。

来自GitHub Actions的一个例子
支持多版本的PHP
作为一个插件构建者,如果你想支持多个PHP版本,请确保CI中的测试是针对你支持的所有PHP版本运行的。
当然,你也可以只支持较新的版本,这个选择完全取决于你。
Juliette专家建议
在 GitHub Actions 上,已经可以针对 PHP 8.2 进行测试,这将确保及时得到需要考虑的 PHP 新变化的警告。
用多个版本的 PHP 进行测试需要使用多个 PHPUnit 版本,这取决于 PHP 版本。由于 PHPUnit 多年来引入了一些影响测试编写方式的变化,这部分可能比较棘手。
为了解决这个问题,你可以使用(由Juliette编写并由赞助)。这可以让你编写官方不支持PHPUnit 9的测试(因此可以在PHP 8.x上运行)。然后Polyfills使你的测试在PHPUnit 4.x到9.x以及PHP 5.4到PHP 8.1(截至目前)中运行。
现在你已经运行了测试,下一步是确保测试中发现的问题被修复。
代码覆盖率
运行这些测试是发现跨版本不兼容的最可靠 *** 。
在这样做的时候,请注意你的测试的代码覆盖率:
通常情况下,开发人员编写和测试–有时甚至是在不知不觉中–是为了 “快乐的路径”。在这些情况下,测试当意外的数据被传递给一个函数时会发生什么也是必要的。只用预期值/类型进行测试是不够的。
上面这句话的第二部分经常被遗忘,而它也许比之一部分更重要。如果你传递一个不正确的类型,会发生什么?你会得到一个错误信息吗?还是变量与函数一起继续正常地投递?如果向函数传递了一个意想不到的值会怎样?
一定要用意外的变量、类型和值来测试你的函数。只有这样才能依靠你的测试来发现新的PHP版本可能引起的问题。
PHP正在变得更加严格
在如何处理 PHP 自己的函数的 “类型 “以及像动态属性这样的东西方面,PHP 正在变得更加精确(严格)。这些变化通常是为了帮助开发人员提供无错误的代码(好吧,就是错误少的代码)。但这对基于 “旧 “的PHP原则编写的现有代码来说,是一个很大的升级障碍。
由于这种在 PHP 中寻求更有帮助的错误信息的驱动力,你可以看到使现有的代码适合新的 PHP 版本需要越来越多的时间。使在 PHP 5.6 上运行的代码适用于 PHP 7.0,与升级代码使其适用于 PHP 8.1 相比,在大多数情况下只需花费很小的时间。尽管PHP 7.0是一个 “大 “版本,而PHP 8.1是一个 “小 “版本。
在很多情况下,测试仍然是确定需要修改什么以支持新版本的唯一可靠 *** 。
单元测试可以通过各种工具进行,包括:
这些工具中的许多都是基于或结合PHPUnit而建立的。
归根结底,使用什么工具并不重要。最重要的是你要测试,并让测试在新的PHP版本上运行。这一步有时会很麻烦,但幸运的是,正如前面提到的,有一些工具可以做到这一点,比如。
集成测试是在静态分析和单元测试之后,我们要进行的下一步工作。集成测试是在更大的范围内测试真实情况,而不仅仅是一个 “代码单元”。这包括与活动(测试)数据库的测试或与外部API的测试,仅举两个例子。
所以,当你在WordPress的背景下测试一个插件或主题的代码,并使用一个真实的版本,根据定义,这些是集成测试。
WP Test Utils(同样由Juliette编写,由Yoast赞助)是一个优秀的集成测试工具。WP Test Utils提供了编写集成和单元测试的工具,其中WordPress是用和 “模拟 “出来的,其中常用的WordPress函数是 “假的”,这样你就在测试你自己的代码而不是WordPress的代码。

GitHub上的WP测试工具
与WordPress的集成测试是一个比较棘手的故事,因为它涉及与WordPress和WordPress的测试套件的集成。根据一个插件或主题支持哪些版本的WordPress,你必须考虑WordPress本身支持哪些PHPUnit版本,以便在不同的PHP版本上运行测试。
例如,WordPress 5.6到5.8使用来测试,但从WordPress 5.9开始,WordPress本身也使用PHPUnit Polyfills来提供更广泛的支持。WP Test Utils作为一个桥梁来克服所有这些差异。
想了解更多关于如何对多个不同版本的WordPress运行集成测试,包括WordPress 5.9及以上版本?那就吧。
现在你已经通过了单元测试和集成测试,并且修复了所有你发现的问题,现在是时候进行人工测试了。你的网站正在运行,你自己的代码也在工作,但你还在使用插件A、B和C,你知道这些插件是否兼容吗?
例如,向插件的作者核实一下,看看他们是否表明它与PHP 8.x兼容。当然,接下来的问题是,该插件是如何被测试的。通常这里的答案是:孤立的。该插件的功能通常是单独与WordPress一起测试的,没有其他活跃的插件。而且,即使在这些测试中使用了其他的插件,也有可能不是所有你使用的插件都是测试的一部分,所以对这样的兼容性声明要多加注意。
例如,一个WordPress网站有3个插件(A、B和C)。例如,插件B有可能通过一个过滤器返回一个不正确的变量类型,而插件C使用同样的过滤器,想要与之合作。这可能会导致一个致命的错误,因为该类型不再是预期的。插件C就会被看作是错误信息的罪魁祸首,尽管插件B才是真正的罪犯。
插件的互操作性-不相容性在单独测试时是不可能发现的。活跃的插件越多,就越有可能出错。例如,将页面请求从一个实时网站传递到一个暂存环境(启用错误记录),以发现实际出错的地方,这将是非常有益的。
对于这种类型的问题,网站所有者通常只会看到最后执行的代码有错误的信息(在这种情况下,来自插件C),尽管插件C不一定是问题的原因。
在大多数情况下,涉及到大量的人工工作,并且需要大量的精力来检测和修复这些问题。这可以通过端到端测试来实现自动化,但我们在WordPress中并没有看到这种情况。
测试使用的插件的可用性
对于开发者和开发团队。只有在有测试的情况下才接受代码。这样,你可以确保减少人工测试,从而节省大量的时间。
如果你想购买一个商业插件或主题,请质疑其测试策略。这样,我们共同在WordPress社区的开发者/开发团队中建立起意识,让测试在议程上占据更高的位置,而我们都会受益。
测试经常被视为–不公平地–是一种成本,而实际上,它可以省钱。编写测试所需的额外投资以大大减少错误报告和减少修复错误的时间的形式得到回报。此外,通过自动化软件测试,扩展和修改可以更快完成,因为测试可以迅速确认现有功能继续工作。
Juliette专家建议
当你想开始写新的代码时:
在你在评论中描述的原始逻辑中,有一半会消失,因为它已经被代码所取代。留下其余的评论,因为如果你有一段时间没有看你的代码,它们可以帮助你以后再次理解逻辑。
对于普通的网站所有者来说,来自你的主机的指导是非常可取的。请考虑以下几点:
这对虚拟主机也有好处,因为当问题出现时,网站所有者通常会联系主机寻求帮助。在切换到 PHP 8.0 或 8.1 的情况下,网站所有者要对潜在的问题负责,所有者有越多的信息来为切换做适当的准备,就越好。
作为虚拟主机,向客户提供 PHP 8.0 或 8.1 是一件事,但在这样做的时候,他们必须确保在客户中建立起意识,让他们意识到问题可能会浮现。建议在暂存环境中用与实时不同的版本测试你的网站。
目前有超过15%的网站使用PHP7.0或更低的版本。这可以在中看到。大约83%的WordPress网站目前使用PHP 7.4或更低的版本。请注意,任何低于或等于7.4版本的东西目前都。使用报废的PHP版本会导致问题,因为安全更新已经不再发布。
为了避免问题,重要的是WordPress的站长们知道并了解能让他们的网站安全运行的最小PHP版本。就他们而言,网站所有者可以自己修改PHP版本或要求他们的主机将网站更新到一个较新的PHP版本。在极端情况下,你可以切换到支持这些较新版本的主机。
因为WordPress只需要,所以很多主机商和网站所有者没有足够的动力去更新他们的网站。而这是尽管PHP7.4在达到了它的寿命终点。
如果WordPress真的提高了更低PHP版本,这可能意味着许多网站将不再兼容更新到最新的WordPress版本。然而,在相当长的一段时间内,安全更新将继续为那些过时的版本发布。
要为网站切换到 PHP 8.0 或更高版本,您或您的开发人员必须执行几个步骤。重要的步骤包括:
当转换到 PHP 8.x 时,要确保所有的东西都已经过正确的测试。这是保证你的网站在较新的PHP版本上正确、快速、安全地运行的唯一 *** 。
不久前,PHP 8.0大张旗鼓地发布了。它带来了许多新特性、性能增强和变化——其中最令人兴奋的是新的JIT编译器。 技术世界总是在向前发展,PHP也是如此。 ,包含了几个令人兴奋的特性。它定于今年晚些时候于2021年11月25日发布。 在本文中,我们将详细介绍PHP 8.1将带来哪些新的东...
宝塔面板中的网站管理是非常重要的一部分,也是站长经常需要使用到的功能模块。网站管理,主要用于管理和创建WEB站点。如果您是宝塔面板的使用用户,应该对此模块有充分的了解,以便于您更高效地管理网站。 宝塔面板网站管理模块包括:添加新网站、修改默认页、设置默认站点、站点列表、站点的运行与停止、备份站点、...
每台连接到Internet的计算机都有一个Internet协议 (IP) 地址。但是,并非所有IP地址的外观或行为都相同。 如果您使用计算机网络或服务器,了解动态IP和静态IP之间的区别至关重要。通过详细了解每个协议,您可以选择最适合您需求的解决方案。 在本文中,我们将讨论静态和动态IP之间...
宝塔面板设置主要涉及的是宝塔控制后台自身的参数,包括诸如面板的开关、自动更新及SSL、面板端口设置等。虽然这部分不涉及服务器自身的管理,但对宝塔面板的设置也有其重要。 特别是面板端口、安全入口及面板密码等涉及安全的参数设置。 启动和关闭面板 如果你长时间无需使用到宝塔面板,可以考虑...
宝塔面板提供丰富的软件以一键安装,这让服务器环境搭建提供不少的便利性,站长可以根据实际需求快速编译安装以实现不同的功能需求。 软件管理,主要是宝塔提供的一些面板扩展插件。 Nginx Nginx是一个高性能的HTTP和反向代理服务器,具有轻量级、占用内存小,并发能力强等优势。 w...
宝塔面板的计划任务,主要用于安排和管理需要定时执行的任务,如备份、内存清理等。其实对于大部分站长来说,主要使用该板块的备份网站、备份数据库及释放内存的三个定时任务计划。 Shell脚本的添加 输入任务名称,选择执行周期,输入执行的脚本内容。 注意事项: 输入脚本内容...