問題描述

我經常聽說有很多外掛會減慢 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 輔助翻譯的英文資料結果。如果您對結果不滿意,可以加入我們改善翻譯效果:薇曉朵技術論壇。