【翻譯】 WordPress 優化建議

WordPress 系統的原始設計上,為了方便性與二次開發的簡化,所以做了很多的 API 很多累贅的事情(註1)。
因此,系統需求上就比較龐大一點,因此需要做一些優化的事情來讓他的工作效率比較優良一些。
不過,優化的事情很多只是一個大方向一個需要做的事情,裡面提到的一些作法或是修改方法,不一定在所有的情況之下適用,特別是一些伺服器端的設定,這與你伺服器的規格等級有相關性。

1. 檢查你的網站大小
最常見與最普面的網站緩慢的原因,來自於網頁內容本身的龐大。網頁內容中包含有大量的圖片、Flash 或是 Javascript 內容,因此需要下載大量的檔案導致的。
可以使用 Firefox 的 Firebug 外掛來檢查檔案的大小。
建議保持一個頁面的大小在 100KB以下,可以的話最好在 50KB以內。

2. 檢查你的系統
在某些情況下,可能是你的作業系統導置緩慢的。

3. 檢查你的外掛
讓你網站變慢的主要嫌犯就是外掛,當你使用了許多的 WordPress 外掛,可能是因為外掛本身設計不良導致的。
請停用你所有的外掛,然後一一的檢查是否包含有導致你網站變慢的原因。

4. 檢查你的佈景主題
如果不是外掛,那麼再下來的嫌疑犯就是佈景主題。
同樣的因為佈景主題中也包含有大量的程式碼或是外掛動作於 function.php 檔案之中。
或是引入了過多的 Javascript 與圖片檔案,導致頁面加載速度緩慢。
使用 WordPress 預設的佈景主題是一個很好的測試方案。

5. 優化你的資料庫
定期的最佳化你的資料庫 (OPTIMIZE TABLE) ,可以獲得較佳的效能。
你可以嘗試使用 WP-DBManager 外掛來協助你進行這件事情。

6. 關閉文章版本
在 WordPress 2.6 ,文章版本的機制被加入到 WordPress 當中。這功能會再你每一次的儲存之後多增加一篇文章到資料庫當中。
如果你不需要這功能,請在你的 wp-config.php 檔案當中加入

define('WP_POST_REVISIONS', false);

並且刪除已經存在於資料庫當中的舊版本的文章。註2

DELETE FROM wp_posts WHERE post_type = "revision";

7. 快取的實現
以現成的資料取代從資料庫搜尋資料再生成頁面就是很有效的優化方式。所以快取就是一種很有效的優化方式。
一般推薦使用整體頁面內容的快取系統,例如:WP Super Cache 就是一個不錯的選擇。
另外,針對二次開發的網站,可能無法使用整體頁面內容的快取系統,可以考慮使用 WP File Cache 這一套,他是針對 WordPress 本身內含的 WP_Object_Cache 進行檔案化的快取。

8. MySQL 優化
啟用 MySQL 本身內鍵的快取系統,透過在 my.ini 檔案當中添加

query_cache_type = 1
query_cache_limit = 1M
query_cache_size = 16M

這會在你的 MySQL 當中啟用一個單筆資料最大 1MB 總計 16MB 的快取區。實際上快取區的容量大小限制需要是你運行 MySQL 的伺服器有多少的記憶體空間來決定,並非越大越好。
可以透過執行以下的 SQL 查詢來確認快取的運行情況

SHOW STATUS LIKE 'Qcache%';

會得到一個類似這樣的結果

Qcache_free_blocks 718
Qcache_free_memory 13004008
Qcache_hits 780759
Qcache_inserts 56292
Qcache_lowmem_prunes 0
Qcache_not_cached 3711
Qcache_queries_in_cache 1715
Qcache_total_blocks 4344

這裡提供一個更進階的優化設定,這只式原作者提供出來的一個範例,並不一定合適於你的伺服器環境中運作。

[mysqld]
bulk_insert_buffer_size = 8M
connect_timeout=10
interactive_timeout=50
join_buffer=1M
key_buffer=250M
max_allowed_packet=16M
max_connect_errors=10
max_connections=100
max_heap_table_size = 32M
myisam_sort_buffer_size=96M
query_cache_limit = 4M
query_cache_size = 250M
query_cache_type = 1
query_prealloc_size = 65K
query_alloc_block_size = 128K
read_buffer_size=1M
read_rnd_buffer_size=768K
record_buffer=1M
safe-show-database
skip-innodb
skip-locking
skip-networking
sort_buffer=1M
table_cache=4096
thread_cache_size=1024
thread_concurrency=8
tmp_table_size = 32M
wait_timeout=500

# for slow queries, comment when not used
#log-slow-queries=/var/log/mysql-slow.log
#long_query_time=1
#log-queries-not-using-indexes

[mysqld_safe]
nice = -5
open_files_limit = 8192

[mysqldump]
quick
max_allowed_packet = 16M

[myisamchk]
key_buffer = 64M
sort_buffer = 64M
read_buffer = 16M
write_buffer = 16M

如果確定有 MySQL 優化上的需求,如果不能用試誤的慢慢研究,強烈建議還是尋求專業人士的協助。
mysqlreport 這是一個分析工具,可以協助你進行調整。

9. PHP 編譯碼快取
php 是一種直譯式語言,所以每一次運行都需要將 php 原始碼編譯成機器碼之後再交由系統運行。可以利用 eAccelerator 將編譯過的機器碼進行快取。

10. 網頁伺服器優化
在 Apache 的設定檔中添加以下,以減少單一網頁的進程數。

KeepAlive On
MaxKeepAliveRequests 100
KeepAliveTimeout 5

還有很多的方法可以使用,不過就如同之前 MySQL 的優化一樣,請清楚的了解你正在進行的動作是什麼才進行,如果不清楚還是尋求專家的協助會比較好一點。
另外,將靜態資料的網頁伺服器更改成使用 nginx 來運行也是很棒的優化方式。

11. 更新與引用
有時候 WordPress 的會慢是因為更新通知與引用通知導致的。
更新通知的在你的網站後台的【設定→寫作】,或者取消自動通知所有可能的引用者,於【設定→討論】當中修改。

12. 使用子網域平衡負載
因為多數的瀏覽器同時只會向一個網域請求二到四個檔案。所以你可以透過將圖片轉移到子網域上,將樣式設定 style.css 與相關文件轉移到子網域上,讓瀏覽器在同一時間抓取更多的檔案而減少等待的時間。

13. 減少 HTTP 請求次數
使用較少的圖片(通過將數個圖片組合成一張圖片,並利用 CSS 技巧取得正確的圖片),將數個 javascript 檔案合併成一個檔案,將 CSS 檔案合併成一個檔案。都可以降地 HTTP 的請求數量。
可以利用 CSS Sprite generator 來協助你進行圖片的合併工程。

14. 壓縮檔案
透過壓縮檔案可以得到更小的檔案來加速傳輸的過程。
雖然需要花費額外的時間解壓縮,但壓縮之後傳輸上節省的時間,比解壓縮的時間還要多。
透過添加以下代碼在你的 .htaccess 來達到此目的

AddOutputFilterByType DEFLATE text/html text/plain text/xml text/css application/javascript application/x-javascript application/x-httpd-php application/rss+xml application/atom_xml text/javascript

15. 加入檔案的過期標籤
透過檔案的過期標籤,讓瀏覽器快取檔案不用每一次瀏覽都重新向伺服器抓取檔案,這對於圖片來說是很棒的方式。
透過添加以下代碼在你的 .htaccess 來達到此目的

<FilesMatch ".(ico|jpg|jpeg|png|gif|js|css|swf)$">
ExpiresActive on
ExpiresDefault "access plus 30 days"
Header unset ETag
FileETag None
</FilesMatch>

可以使用 Cacheability Query 來檢查設定的狀況。

16. Gravatar 快取
WordPress 的留言頭像是透過 Gravatar 提供的服務來達成的。不過 Gravatar 的系統存在有一個問題,那就是他的頭像檔案並不包含有過期標籤。
可以透過將頭像儲存在自己的伺服器上並加上過期標籤來達成。

19. 最佳化圖片
透過將圖片的最佳化工具 Smush.it 來將圖片本身的大小縮小,進而減少傳輸的資料量。

20. CSS與Javascript的順序
藉由將 CSS 放置在頁首的位址,將 Javascript 放置在頁尾(如果可以的話),讓使用者可以先看到網頁的內容。

原始文章連結:http://www.prelovac.com/vladimir/wordpress-optimization-guide
本文並非原文翻譯,而是經過我自己的想法與見解後的文章,但優化的項目為原始文章的建議。

註1:這裡累贅的事情,從系統開始全部客製化開發的系統而言。
註2:對於資料庫的操作,請先做好完善的備份措施,並且確定你有復原的能力。如果不確定如何操作,請找專業人士協助。

KeepAlive On
MaxKeepAliveRequests 100
KeepAliveTimeout 5
我們的空間該怎麼設定?

這是 SERVER 等級的問題
自己管理的主機請修改 Apache 的 httpd.conf 設定檔
租用虛擬主幾的人,請洽主機商。

不過,是否要開啟本設定,與相關的 最大數量與存活時間 與主機環境有關係。
也與單一頁面的檔案數量有關係,不是開啟就一定效能會比較好,也不是數量越大越好。
而租用主機的理由之一,就是要讓維護優化伺服器的環境之艱深工程讓專業人士處理。

首先是,關於各個不同加速器的效果究竟如何?各有什麼優缺點? 先提供一篇英文文章給大家參考:Benchmarking PHP accelerators http://www.ipersec.com/index.php?q=en/bench_ea_vs_apc 文中分別比較了 APC、eAccelerator 以及 ZEND 三種不同的加速器。 文中認為,eAccelerator 與 ZEND 的表現結果差不多, 但是掛著 beta 字樣的 eAccelerator 似乎比較不是那麼的穩定。 (這篇文章應該是寫於 eAccelerator 0.9.5 尚未推出的時候, 目前穩定度如何,尚待相關資料來佐證。) 至於 APC,是由 PHP 的核心發展成員所開發,並計劃內建於 PHP6。