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


