Products
GG网络技术分享 2025-03-18 16:16 0
之前介绍了文章【加快页面加载速度 Performant Translations插件上线】,不少小伙伴来问,Performant Translations插件是什么?Performant Translations插件加速效果怎么样?Performant Translations插件有没有冲突之类的。这里看到Performant Translations插件已经发布了,就顺便测试一下,顺便分享一下Performant Translations插件加速效果超详细图文评测。
Performant Translations插件采用了一种新方法来处理 WordPress 中的翻译文件,从而使本地化速度飞快。一项深入的 i18n 性能分析表明,本地化后的 WordPress 网站的加载速度明显慢于没有翻译的网站。
有了这个插件的本地化新方法,这种开销就会大大减少,从而使您的网站再次快速运行。该插件的主要目的是允许对这些增强功能进行更广泛的测试,其目标是最终在 WordPress 内核中实现这些功能。
Performant Translations 支持多种文件格式(.mo、.php 和 .json),以及同时加载多个文本域和本地语言。默认情况下,它会将现有的 .mo 文件转换为 .php,然后只加载 .php 文件中的翻译。
简单来说就是,WordPress是英文为主的CMS程序,如果用其他语言主题(如中文、德文),则页面加载速度总体上会比英文页面要慢,原因是中间增加了语言解析的步骤。这里使用直接把翻译的内容缓存到Opcache中,起到加速的作用。
初始基准测试显示,本地化网站的平均加载时间可能比非本地化网站慢 50% ,具体取决于所使用的主题和插件。这是使用wpp-research CLI 工具和专用基准环境进行测量的(如最后的比较部分所述)。
WordPress i18n 系统基于gettext,它使用源.po
(可移植对象)文件和二进制.mo
(机器对象)文件来存储和加载翻译。它不使用 C gettext API本身,而是使用自定义用户区实现,无需任何外部依赖即可工作。
除了核心本身之外,每个插件和主题都有自己的翻译文件,必须在每个请求时加载和解析该文件。加载和解析所有这些翻译文件是一项昂贵的任务。
过去,人们已经讨论和探索了各种解决方案来提高 WordPress 的国际化性能。一个非详尽的列表:
.mo
,例如纯.php
文件关于从哪些方面着手,官方进行了大量的测试及研究,以下是官方的研究方向。
使用不同的文件格式进行翻译而不是 .mo 文件,以避免加载和解析二进制文件的开销。
使用此解决方案,翻译将存储在.php
返回翻译字符串关联数组的纯文件中。只要.php
文件可用,它将优先于.mo
仍用作后备的文件。架构的其余部分保持不变。
当本地化 WordPress 网站从translate.wordpress.org翻译平台下载语言包时,它会下载.po
包含.mo
所有翻译的文件。这将被修改以包含.php
文件。该平台所基于的GlotPress将进行更新以支持这种新的输出格式。此外,WordPress 核心本身可以修改为在 PHP 文件丢失时生成它们。
理论上,在 PHP 中没有什么比加载和执行另一个 PHP 文件更快的了。.json
、.ini
、 或.xml
都会慢得多。
使用 PHP 文件的概念证明可以在swissspidy/wp-php-translation-files和swissspidy/ginger-mo中找到。
.po
为.mo
).mo
文件,这是主要瓶颈.mo
支持可能会被废弃使用 PHP 文件的概念证明已经非常可靠。还有 WP-CLI ( PR ) 和 GlotPress ( PR ) 更改的示例。这使得它适合功能项目,只需很少的努力即可扩展测试。即使是核心合并也会在相对较短的时间内非常简单,可能在 2023 年第 4 季度就已经完成。使用 PHP 文件时的安全方面可能是潜在的障碍,因此尽早让 WordPress 安全团队和托管提供商参与进来非常重要。
需要更多时间来测试其他文件格式并比较结果。
使用用 C 编写的本机 gettext PHP 扩展(如果可用),而不是 WordPress 中的自定义内置解析器。
WordPress 一直使用自定义 MO 文件解析器,因为本机 gettext 扩展不一定在服务器上可用。通过此解决方案,现有系统可以在可用时使用扩展,如果不可用则回退到自定义实现。
之前已探讨过这一点,并在WP Performance Pack和Native Gettext中实现。这些实现可以作为初始设计的灵感。它们的工作原理都相似,即它们将翻译文件符号链接或复制到与 gettext 扩展兼容的新目录结构。
根据 WordPress 更新请求的信息,截至 2023 年 7 月,大约 66% 的本地化 WordPress 网站安装了 gettext 扩展。
pt_PT_ao90
、de_DE_formal
或 之类的区域设置roh
甚至可能不受支持LC_MESSAGES
和LANGUAGE
),这可能不可能或在某些服务器/站点上导致冲突虽然该解决方案可以利用现有的实现,但需要进一步的现场测试来评估该扩展是否在所有情况下都能正常工作。考虑到糟糕的 API 的限制和安装语言环境的要求,它看起来根本不是一个可行的解决方案。
以某种方式缓存翻译以避免昂贵的.mo
解析。
将翻译缓存在磁盘、数据库或对象缓存中,以避免.mo
后续请求中昂贵的文件解析。这可以以通用方式完成,也可以基于每个请求来完成,以仅加载当前URL所需的翻译。
过去已经以各种形式探索了许多不同的缓存策略,每种策略都有自己的优点和缺点。有些甚至可以合并。定义确切的实现需要进一步的探索和测试,这需要它自己的探索文章。
.mo
解析后缓存翻译可能会提高未来请求的性能鉴于生态系统中现有的解决方案,工程工作本身不会太大,但需要首先评估正确的缓存实现(例如磁盘缓存或对象缓存)。
然而,由于托管环境不同,可能不存在正确的缓存策略。由于核心支持多种类型的缓存是不现实的,因此该解决方案似乎更适合插件而不是核心。
在某些情况下,使用延迟评估的转换调用可以减少函数调用的数量,从而提高性能。
延迟评估翻译调用的想法已在#41305中首次讨论。通过传递代理对象,它可以避免特定于字符串的昂贵翻译查找,直到实际需要翻译为止。
换句话说:除了即时加载翻译文件(WordPress 已经做到了)之外,这还将添加对翻译中各个字符串的即时查找。
它本质上可以通过两种方式集成,这两种方式都在核心票证上进行了解释:
逐步采用意味着需要多年的努力来建立延迟评估的翻译调用,而默认情况下启用此功能是一个重大的向后兼容性破坏,可能会影响生态系统中的数千个插件和主题。由于在某些情况下它确实会降低性能,因此该解决方案并不是一个很好的实施方案。
重构 WordPress 中现有的 MO 解析器以提高性能。
全面检修 WordPress 中现有的 MO 翻译文件解析器,同时考虑到性能。例如,使用Ginger MO、WP Performance Pack或其他现有解决方案作为基础。
虽然Altis DXP (Human Made) 实际上已经用 Rust 编写的定制 PHP 扩展替换了现有的 MO 解析器,但这种方法对于核心显然是不可行的。新的解决方案需要在用户态 PHP 中编写。
使用更新后的 Ginger MO 分支进行的初步测试显示出一些明显的加速和更低的内存使用量。它还支持每个文本域多个翻译文件以及一次加载多个语言环境,这可能有利于改进WordPress 核心中的语言环境切换功能。
除此之外,WP Performance Pack和DynaMo等插件已经使用MO 哈希表或二分搜索实现了部分查找,避免读取整个文件并将其存储在内存中。这会稍微降低内存使用量和性能。
该解决方案已经有了有效的概念验证,但需要更多测试来进一步完善它并改进其向后兼容性层。由于这样的努力是功能插件的理想候选者,因此可以在几个月内相对较快地实现这一目标。
将插件和主题的翻译文件拆分为更小的块,以提高加载效率。
根据项目的大小,翻译文件可能会很大。这就是为什么 WordPress 本身为管理员和其他所有内容使用单独的翻译文件,这样就不会加载太多不必要的字符串。
这种策略也可以应用于插件和主题。要么允许他们使用多个文本域(这需要开发人员教育和工具更改),要么以某种方式自动执行此操作(确切方法待定)
需要进一步的研究来正确评估这一点。
乍一看,解决方案 A(PHP 翻译文件)是一个相对简单的增强功能,它保持了向后兼容性并显示出有希望的改进。然而,它不仅需要改变核心本身,还需要改变翻译平台。安全方面仍然是一个风险,尽管尽早与利益相关者讨论并聚集更多测试人员将有助于减轻风险。
像解决方案 B一样利用本机 gettext 扩展显示了令人惊叹的结果,但缺乏可用性和不理想的 API 是一个问题。尽管如此,它仍然是一个不容忽视的渐进增强。特别是因为它几乎可以消除对额外缓存的需求,如解决方案 C 中那样。
像解决方案 C一样缓存已加载的翻译并不能消除 i18n 缓慢的根本原因,但可以加快后续请求的速度。不幸的是,持久对象缓存或 APCu 相当不常见,并且实现更复杂类型的缓存(例如每个请求缓存)在成为一个持久对象缓存之前需要大量的探索工作。切实可行的选项。
在某些情况下,延迟评估的翻译调用(解决方案 D)可以缩短翻译调用的时间,但总体而言实际上会降低性能。虽然它可以帮助解决一些实际的核心用户体验问题,但向后兼容性和采用问题使其更不是一个合适的解决方案。
现有的 Ginger MO 和 WP Performance Pack 等插件表明 WordPress 中现有的 MO 解析器可以进一步改进(解决方案 E)。
说这么多,其实就是看最后的实际效果。
@wordpress/env
这些基准测试由使用Playwright 的定制性能测试环境提供支持。该环境已配置了一些额外的插件和一些解决方案所需的 PHP 扩展。针对 6.3 RC进行了测试,方法是访问主页和仪表板各 30 次,然后使用中值。官方的测试结果如下:
使用默认的Twenty Twenty-Three主题
语言 | 场景 | 开启对象缓存 | 内存使用 | wp加载 | TTFB |
---|---|---|---|---|---|
en_US | Default | 15.60 MB | 133.58 ms | 138.75 ms | |
de_DE | Default | 29.14 MB | 181.95 ms | 187.65 ms | |
de_DE | Ginger MO (MO) | 19.24 MB | 159.18 ms | 164.30 ms | |
de_DE | Ginger MO (PHP) | 16.98 MB | 138.14 ms | 143.45 ms | |
de_DE | Ginger MO (JSON) | 19.24 MB | 153.39 ms | 158.65 ms | |
de_DE | Native Gettext | 15.99 MB | 142.12 ms | 147.45 ms | |
de_DE | DynaMo | 19.62 MB | 157.93 ms | 163.75 ms | |
de_DE | Cache in APCu | 50.37 MB | 181.51 ms | 187.15 ms | |
en_US | Default | ✅ | 15.67 MB | 121.53 ms | 127.10 ms |
de_DE | Default | ✅ | 29.01 MB | 167.67 ms | 173.55 ms |
de_DE | Ginger MO (MO) | ✅ | 19.11 MB | 147.19 ms | 152.70 ms |
de_DE | Ginger MO (PHP) | ✅ | 16.85 MB | 127.97 ms | 133.65 ms |
de_DE | Ginger MO (JSON) | ✅ | 19.11 MB | 144.43 ms | 149.95 ms |
de_DE | Native Gettext | ✅ | 15.86 MB | 129.19 ms | 134.80 ms |
de_DE | DynaMo | ✅ | 18.57 MB | 133.46 ms | 139.45 ms |
de_DE | Cache in APCu | ✅ | 50.30 MB | 170.19 ms | 176.20 ms |
de_DE | Cache in object cache | ✅ | 29.07 MB | 173.19 ms | 179.25 ms |
WordPress 后台加载
语言 | 场景 | 开启对象缓存 | 内存使用 | wp加载 | TTFB |
---|---|---|---|---|---|
en_US | Default | 15.42 MB | 139.83 ms | 155.60 ms | |
de_DE | Default | 31.92 MB | 187.76 ms | 199.05 ms | |
de_DE | Ginger MO (MO) | 20.07 MB | 164.94 ms | 175.10 ms | |
de_DE | Ginger MO (PHP) | 17.09 MB | 139.66 ms | 149.90 ms | |
de_DE | Ginger MO (JSON) | 20.06 MB | 160.87 ms | 175.05 ms | |
de_DE | Native Gettext | 15.95 MB | 143.43 ms | 153.60 ms | |
de_DE | DynaMo | 20.58 MB | 166.79 ms | 178.05 ms | |
de_DE | Cache in APCu | 58.13 MB | 190.38 ms | 201.20 ms | |
en_US | Default | ✅ | 15.66 MB | 112.69 ms | 127.50 ms |
de_DE | Default | ✅ | 31.84 MB | 164.26 ms | 177.00 ms |
de_DE | Ginger MO (MO) | ✅ | 19.99 MB | 140.70 ms | 153.55 ms |
de_DE | Ginger MO (PHP) | ✅ | 17.01 MB | 118.52 ms | 129.25 ms |
de_DE | Ginger MO (JSON) | ✅ | 19.98 MB | 138.49 ms | 151.55 ms |
de_DE | Native Gettext | ✅ | 15.87 MB | 120.01 ms | 130.40 ms |
de_DE | DynaMo | ✅ | 19.73 MB | 120.26 ms | 130.50 ms |
de_DE | Cache in APCu | ✅ | 58.07 MB | 162.41 ms | 172.90 ms |
de_DE | Cache in object cache | ✅ | 31.86 MB | 164.28 ms | 175.90 ms |
总体来说,在开启对象缓存后,安装了Performant Translations插件比不安装Performant Translations插件的网站页面加载速度要快20-30%这样。实际是不是这样呢?这里以实际的页面测试效果来试一下。
首先,选择的主题是【Enfold 5.6.6完美汉化中文版|多用途自定义商业商店WordPress企业主题模板】,然后语言环境为中文。其他系统环境如下:
在只安装Performant Translations插件,不安装其他WordPress缓存优化加速插件的情况下进行测试。测试的就简单粗暴一点了,就直接浏览器测试加载时间,不启用本地缓存的情况下,不断用Ctrl+F5加载。
1、首页
测试加载时间
测试次数 | 未启用Performant Translations插件 加载时间 | 启用Performant Translations插件 加载时间 |
1 | 1.52s | 1.16s |
2 | 1.36s | 1.44s |
3 | 1.21s | 1.03s |
4 | 1.12s | 1.03s |
5 | 1.16s | 1.02s |
6 | 1.35s | 986ms |
7 | 1.28s | 1.02s |
8 | 1.29s | 1.59s |
9 | 1.31s | 983ms |
10 | 1.31s | 965ms |
以上对比后,未启用Performant Translations插件的时候,首页加载速度一般在1.2-1.4s之间,启用Performant Translations插件后,发现在第一两次测试后进行了缓存翻译,然后加载速度确实有了30%以上的速度提升,首页加载速度一般在1s左右。
2、内页
测试加载时间
测试次数 | 未启用Performant Translations插件 加载时间 | 启用Performant Translations插件 加载时间 |
1 | 1.13s | 893ms |
2 | 1.07s | 932ms |
3 | 1.17s | 987ms |
4 | 1.12s | 974ms |
5 | 1.06s | 952ms |
6 | 1.02s | 951ms |
7 | 1.47s | 1.02s |
8 | 1.09s | 884ms |
9 | 1.09s | 852ms |
10 | 1.12s | 976ms |
以上对比后,未启用Performant Translations插件的时候,内页加载速度一般在1-1.1s之间,启用Performant Translations插件后,内页加载速度一般在1s以内,基本在900ms左右。
因为以上是未启用WordPress优化加速插件进行测试的,有的小伙伴可能会问了,既然速度可以提升这么多,能不能和WordPress缓存优化加速插件一起使用,这里要告诉你的是,首先Performant Translations插件还不是很成熟,不适合直接用在生产站点上。再次,也进行了测试,在启用WordPress缓存优化加速插件后,基本都缓存了,至于Performant Translations插件的效果基本没啥区别。
因此,认为,如果你已经启用了WordPress缓存优化加速插件,如WP Rocket 【WP Rocket完美汉化中文版|WordPress网站缓存优化加速专业插件介绍】,各种对象缓存什么的都启用了的话,使用Performant Translations插件提升的意义不大。如果你自己的主题本来就是汉化主题,语言包也很大,加载很慢的情况下,可以尝试使用Performant Translations插件。
Demand feedback