問題描述
檢視當前的 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 輔助翻譯的英文資料結果。如果您對結果不滿意,可以加入我們改善翻譯效果:薇曉朵技術論壇。