问题描述
查看当前的 WordPress 代码库,显然功能是 over-used 。我的计数超过 8,100 个功能/方法在 WordPress 代码库内定义。这是可怕的,可怕的资源利用。
这个很多函数 (或类) 的问题是,这意味着 WordPress 不是 DRY(不要重复你自己),我确信这些块中的许多可以被组合或替换为更好的模式。
但是,我们需要一些缓冲当前的 API(所有这些功能),所以我们可以开始组合后端代码,而不用”interface”(松散地) 更改。
解决方案?
PHP 5& 6 具有 SPL 自动加载类。这是一个功能,允许 PHP 等到它需要一个类才能加载它。此 prevents wasted resources 作为未使用的功能/文件,直到需要它们才被加载。
不幸的是,WordPress 不能使用这个,因为 PHP 中的”autoloading” 只适用于类.. 而 WordPress 是一个功能高峰。
我正在寻找清理 WordPress 代码库的选项和挑战,这似乎是最大的一个。
因为 WordPress 为插件/主题开发人员创建了这么多功能 (而不是暴露类),似乎没有办法从这个深洞中拔出,而不会破坏数千个主题和插件。
我能想出的唯一想法是编写一个脚本来查看所有函数并将它们转换为可以自动加载的类。在它们的位置,shell 函数将被称为 class-i-fied 版本的函数。
这样的事情
function wp_foo_bar() {
call_user_func_array(array('foo' => __FUNCTION__), func_get_args());
}
有没有人试图清理 WordPress 代码库?这种方法还有其他问题吗?
更新澄清
将系统转换为使用自动加载是第一步,当我们将一些核心功能迁移到更好的设计中时,我们可以更好地控制资源的加载和外观。折旧功能更难。因此,这个问题从系统的开始 re-write 开始。
如果我们停在这里,那么我们可能会因为我们有相同数量的功能而导致性能上的净损失 – 现在类也开始自动加载。
因此,这与程序代码与 OOP 毫无关系。这是关于缓冲 API 对整个系统的更改的最佳方法。目前的 wordpress 开发团队已经很慢了。 WordPress 系统已经有超过 60 个课程。
最佳解决方案
你正在采取非常大的假设,这样的事情会改善业绩。 Spoiler – 不,不会。
加载过程非常宽松,包括:
-
(可选) 运行负责查找定义的代码 (自动加载或自定义) 。
-
解析文件或从操作码缓存中检索结果。
-
加载要使用的结果。
「自动加载快」 是流行的谬误。最重要的自动加载方便。实际上可以减慢实际操作的时间,因为处理文件由操作码缓存大大提高,但是重复定位这些文件 (步骤 1) 只能被优化到目前为止,并且加起来非常快。
WordPress 的核心会从更好的组织和自动加载课程中获益吗?当然,这并不是因为在不使用 PHP 特性的前提下进行开发。
但是”converting” 的功能是自动加载类?我受过教育的猜测会对性能造成破坏,同时试图优化不是瓶颈的部分过程 (在当前的核心代码/负载状态) 。
次佳解决方案
功能解释的代码将总是比 OOP 更快一个。比较
function hello_mark() {
echo 'hello mark';
}
hello_mark();
同
class mark {
function say_hi() {
echo 'hello mark';
}
}
$m = new mark();
$m->say_hi();
我认为很明显,解释和执行更快。
人们不会做 OOP,因为它更快,他们这样做是因为它代表了更好的”problem domain” 并且生成更容易维护的代码。
代码应该以更容易维护和开发的方式进行组织,以便能够始终使用更好的口译员,或编译机器代码或像 Facebook 的 hiphop 一样减少您支持的语言的功能并集成 web 服务器转换成你的口译员
特别是对于 wordpress 来说,影响网站速度最快的是使用缓存的质量。 php 代码的改进不会像使用对象缓存一样提升你的性能。
无论如何,只是因为有很多不是懒惰加载的函数并不意味着即使在懒惰的加载下,它们也不会被 wordpress 完成初始化的时候加载。给核心开发人员一些信誉,知道这个语言足够好,以便能够在不破坏软件的逻辑结构的情况下,将自己的文件初始化所不需要的功能 (即将会很笨 update_option 在不同的文件,然后 delete_option 只是因为 delete_option 在初始化期间未被调用)
第三种解决方案
祝你好运,但这不会以任何真实的方式提高表现。
WordPress 的确越来越多的面向对象,随着时间的推移和增量的变化。过去 4 年的每一次更新都将一些重要的代码重构成了更加面向课堂的设计。
然而,OO 和 autoload 等这样的东西本身并不是”faster”,也不是他们实际上是”better” 。不用担心,这是一个常见的谬误。
一般来说,OOP 是编程中不同的组织方式。对于很多情况来说,这是一个更清洁,更清洁的方法。但是它并不是固有的”better”,而且在几乎所有的 real-world 场景中,实际上都显得更慢,内存更加密集,或者甚至是平均的。 OOP 模型通常是首选,因为 a) 维护和 code-testing 更容易,b) 它在许多学校被教授为”correct” 方式,c) 程序员是喜欢构建事物模型的人。 OOP 适合”model” 心态。使用单个代码代表”thing”,然后让”things” 与其他”things” 进行交互,就像将 lego 片段合在一起。整洁,干净整洁。 🙂
事实是,像操作码缓存这样的东西,自动加载几乎没有速度的好处,只是组织的。而且不要误会我的错,一个好处是一个好处,更好的组织是一件好事。但是您可以通过组织内容而不是通过自动化过程来获得更好的组织。
你可以编写代码来将所有代码移植到类中,然后将这些函数仅仅钩到这些类中?当然可能。它有什么帮助?没有什么实质。
解决你的具体欲望:
It’s much harder to depreciate functions Therefore, this question starts with the beginning re-write of the system.
首先,我想你的意思是”deprecate” 。
其次,您不能一次重写整个事情并实现您的目标。这就是我的一切。回头看 3.1 或 3.2 。现在看 4.0 。注意课程的数量和他们确实在重构时间的方式。
花费大量的时间来重写工作代码才能最终得到相同的结果是没有意义的,除非你要在这个过程中实际改进它。随着 WordPress 中的每一部分的改进,它通常被修改为一个类/OOP 系统。逐渐演变。随着时间的推移变化,允许旧的插件死机,并创建新的代码来支持并修复等等。你不能一夜之间打破世界,期望每个人都跟随,你必须缓慢而有条理地改变事情。
参考文献
注:本文内容整合自 Google/Baidu/Bing 辅助翻译的英文资料结果。如果您对结果不满意,可以加入我们改善翻译效果:薇晓朵技术论坛。