問題描述

查看當前的 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. (可選) 運行負責查找定義的代碼 (自動加載或自定義) 。

  2. 解析文件或從操作碼緩存中檢索結果。

  3. 加載要使用的結果。

「自動加載快」 是流行的謬誤。最重要的自動加載方便。實際上可以減慢實際操作的時間,因為處理文件由操作碼緩存大大提高,但是重複定位這些文件 (步驟 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 輔助翻譯的英文資料結果。如果您對結果不滿意,可以加入我們改善翻譯效果:薇曉朵技術論壇。