问题描述

我经常听说有很多插件会减慢 WordPress 网站的速度。这当然是有道理的,因为执行的代码越多,需要的时间就越长。

我想知道是否缓慢主要是:

  • 是绝对数量众多的插件的结果? (因为 WP 必须做一些处理来定位和加载每个插件)

  • 有几个慢/重的插件的结果?

更实际的是,当我写我自己的时候,我应该将功能组合成更少的文件来获得速度吗?还是可以有 10-20 个插件每个做一个快速的任务?

最佳解决方案

Generalities

「许多插件减慢网站」 的经验法则是一个非常钝的工具,并且由那些不了解插件的工作原理的人永久存在,以便他们选择易于妖魔化的东西。

是的插件可能会减慢您的网站,但它与质量和他们正在努力完成的数量无关。我可以编写一个单独的插件,这样就可以让网站跪下 (如果我有理由这样做),那么比其他 50 个 well-written 插件更糟糕。当然,人们一直写入插件,这样一来,网站就会因为不了解更好而被跪下。

我猜想 「很多插件减慢网站速度」 的唯一原因是,当你有很多插件时,你可能会遇到一个坏的插件。

Specifics

所以让我们来谈谈更多细节。插件使用”hooks”,它们是沿着执行路径运行某些点的 PHP 代码,它们可以执行某些操作,也可以过滤值或两者。 WordPress 早些时候开始调用钩子,努力组成一个网页,并生成 HTML 发送到浏览器,并继续调用钩子,直到它完成给定页面的运行。

根据插件使用的钩子,它可能仅在某些页面上,在”background” 中甚至几乎不会被调用。一些挂钩只能在管理控制台中工作。某些挂钩只能在管理控制台的某些页面中工作。一些钩子由 internal psuedo-cron system 调用。 OTOH,一些插件可以加载额外的 CSS 或 JS 文件,并且由于 Web Performance Rule #1,这些文件中的每一个都会降低性能。

如果你想了解每个页面上调用什么钩子,请考虑使用 「Instrument Hooks for WordPress」 插件,我写了一个问题 「Where Can I Find a List of WordPress Hooks?」 这是插件在页脚中使用时显示的屏幕截图:

但是只要知道这些钩子就不会帮助你确定插件是否有问题。你可以调用一个插件 100 次,调用它可以忽略不计,相比之下,另一个钩子调用,向一个 SQL 查询添加一个 WHERE 子句,可能会破坏一个有超过几百个帖子的站点。或者可以对其他服务器进行 HTTP 调用。或者它可以刷新每个页面加载的重写规则。罪名单继续下去。

通过查看源代码或更好地通过像 PhpStorm+XDEBUG 这样的调试器来运行插件的钩子来验证插件的钩子是唯一真正的方法。

你自己的插件

不要担心如何组织代码以实现性能; 担心你的代码是什么。利用 Transient API(参见:Presentation about the Transient API) 优化频繁运行的 SQL 查询购买将比将 10 个插件的代码合并到一个中更好。

另一方面,请考虑组织您的代码的其他原因。我认为一大串插件可以为很多用户造成心理困扰; 他们看到像这样的屏幕,不知所措,只想简化一下:

然而另一方面,有时候用户可能会因为一个插件太多而不堪重负。例如我用 GD Star Rating Plugin 这样的感觉。在尝试一个项目 (更糟糕的是,试图钩住它来做我需要的),我决定把它抛在耳边。

所以有些人 (像我一样) 经常会喜欢很多小的紧密插件,每个都做一件事情,做得很好 (尽管如果 WordPress 支持一个分组功能有点像 iPhone iOS 4 lets you group apps in folders 那样很好)

无论如何,希望这有帮助。

次佳解决方案

自然插件只是性能故事的一部分,所以你不能用文件的数量来衡量它。还有更多的,你不能提前说出什么工作,所以在你的电脑上可能很好的东西不在别人身上。

而不是寻找性能,您应该定义其他和自己的标准来做出决定。例如,对于插件,您可以将单独的功能放在单独的插件中,以免混淆。这在速度或内存使用方面可能不是性能明显的,但是交易是保持轻松耦合,因此开发和使用插件更容易。不要忘记,当一个新版本的 WordPress 出来时,只有两个插件可能会突破十个,而不是一个大的插件。最后,用户只需要十个插件中的三个,所以他需要更少的内存。

如果用户抱怨她/他的博客的表现,通常可以建议他们只能购买更大的服务器,并且解决性能问题。

(Pre-Mature) 优化是所有邪恶的根源。编写插件时,不要再考虑性能了。拿它轻巧明亮的方式:WordPress 的设计性能不是最终明智的,不要犯错误,并试图为其编写演示插件;

WordPress 是用 Big Ball of Mud-(anti-)design-pattern 设计的。插件系统是一个非常好的工具。只是不要以为你可以像插件一样优化这个作者。你可以’t. Don’t 打它:)

参考文献

注:本文内容整合自 Google/Baidu/Bing 辅助翻译的英文资料结果。如果您对结果不满意,可以加入我们改善翻译效果:薇晓朵技术论坛。