WP Super Cache 和 W3 Total Cache 緩存插件使用 memcached 提升性能

說起 WP Super Cache 和 W3 Total Cache 這兩個大名鼎鼎的 WordPress 緩存插件,很多博客站長們應該是都很熟悉的吧!明月也是 WP Super Cache 和 W3 Total Cache 插件的老用戶了,可以說N年前就使用過的,但因為各種因素最後都放棄了,甚至去年都是使用 WP-Rocket 插件來替代的。至於說WP Super Cache 和 W3 Total Cache 插件當時放棄的原因主要還是「穩定性」太差這個原因的,但是現在回憶細想一下這個「穩定性」其實跟伺服器許可權是有很大的關係的。

因為 WP Super Cache 和 W3 Total Cache 實在是太強大了,強大到需要伺服器的一些具體配置。而以前因為使用的是「虛擬主機」,在一些「許可權」上還是有很多限制的,所以就造成運行時間久了以後就會出現各種「不穩定」問題了,記得當時最受不了的就是百度蜘蛛抓取一直返回503錯誤的問題很讓我「抓狂」呀。最近正好在VPS上針對 WP Super Cache 和 W3 Total Cache 進行了分別的安裝和調試,兩個插件根據站點流量需求分別用在不同的站點上。

從 WP Super Cache 和 W3 Total Cache 兩個插件的原理和性能上來說, WP Super Cache 比較適合日IP在1000以內的站點使用,因為並發流量過高的情況下使用 WP Super Cache 會造成主機負載壓力,並且有時候這個負載壓力還是蠻大的,當然如果伺服器主機硬體配置高大上,這個負載壓力是可以忽略不計的。

而 W3 Total Cache 的緩存性能相對於 WP Super Cache 來說提升很明顯,同時對並發流量過高的承受度還是可以接受的,所以配合適合的伺服器硬體配置主機還是個很不錯的「高性價比」 WordPress 緩存方案的,這裡所說的伺服器硬體配置主要是指CPU、內存這兩個指標的哦。

關於 WP Super Cache 和 W3 Total Cache 插件的具體配置我就不再多說了,因為網上實在是太多類似的文章了(當然大部分都是「千篇一律」的拾人牙慧而已),大家可以隨便百度一下了解了,今天主要講講 WP Super Cache 和 W3 Total Cache 插件使用伺服器端的 memcached 來提升緩存性能。、

memcached 是什麼?

Memcached 是一個高性能的分散式內存對象緩存系統,用於動態Web應用以減輕資料庫負載。它通過在內存中緩存數據和對象來減少讀取資料庫的次數,從而提高動態、資料庫驅動網站的速度。Memcached基於一個存儲鍵/值對的hashmap。其守護進程(daemon )是用C寫的,但是客戶端可以用任何語言來編寫,並通過memcached協議與守護進程通信。

主要特徵

  • memcached作為高速運行的分散式緩存伺服器,具有以下的特點。
  • 協議簡單
  • 基於libevent的事件處理
  • 內置內存存儲方式
  • memcached不互相通信的分散式

關於 memcached 其實說白了,就是 PHP 的一個內存加速器, memcached 會把需要 PHP 運行的代碼直接放在伺服器內存里來加快運行效率,相應的 WP Super Cache 和 W3 Total Cache 使用 memcached 也就是把一些重要的緩存放到內存里加快了客戶端請求的載入時間也就變相的提升了網頁的載入速度以及緩存插件的執行效能。

PHP 有 memcached 和 memcache 兩個類似組件,百度搜出來的文章,大部分是教你如何安裝memcache(d),卻不解釋二者的區別。如上圖所示在LNMP里添加 memcached 模塊的時候會提示選擇 memcache 還是 memcahed 的。

簡單來說:

  • memcache 是 pecl 擴展庫版本,原生支持php,出現更早,是老前輩;
  • memcached 是 libmemcached 版本,出現較後,是新一代,因此也更加完善,推薦使用。

Ps:如果想更深入了解,可以搜索下 memcache vs memcached

關於伺服器端具體的部署 memcached 我就不多贅述了,在軍哥 LNMP 環境下只需要運行 ./addons.sh install memcached 來自動編譯安裝即可了,很方便的,其他生產環境自行百度吧。

在 WordPress 里要啟用 memcached 的支持需要一個 object-cache.php ,上傳到 wp-content目錄,這裡百度上很多的教程上提供的 object-cache.php 下載鏈接都是 memcache 的,在 memcached 下使用會出現訪問「500錯誤」的,所以一定要確認自己是 memcached 還是 memcache , memcached 的 object-cache.php 可以在 GitHub 獲取到如:https://github.com/tollmanz/wordpress-pecl-memcached-object-cache 這裡下載上傳即可。(這裡要感謝【張戈博客】的文章【WordPress啟用memcached動態緩存以及報錯解決】一文里的分享,讓我走了很少的彎路。)

完成上述的伺服器端的配置後,就可以在 WP Super Cache 和 W3 Total Cache 插件配置里啟用 memcached 的支持了,不過為了讓 WordPress 準確的找到 memcached 的 IP 和埠最好還是要在 wp-config.php 里添加上 memcached 的具體信息的,具體放置位置以文件開頭為宜,如下:

  1. global $memcached_servers;
  2. $memcached_servers = array(
  3. array(
  4. IP地址(默認:127.0.0.1), // Memcached server IP address
  5. 埠號(默認:11211) // Memcached server port
  6. )
  7. );

記得核對好代碼里的IP地址和埠號與伺服器端 memcached 的一定要一直哦。

WP Super Cache 中開啟對 memcached 的支持

這裡以 WP Super Cache 目前最新版1.5.3版本為例(百度里的很多類似教程都無視了版本號差異,真的有很大的差異的), WP Super Cache 的 memcached 支持目前還在「內測」階段的,所以用「Simple」方式緩存的是無法使用 memcached 的,所以需要切換 WP Super Cache 緩存模式為「Expert」,這樣才可以在下面的「高級」裡面看到「使用對象緩存系統來存儲緩存文件。 (實驗室功能)」這個選擇項目開關。如下圖:

選擇這個開關為開啟後,點擊下面的「更新」,然後清除 WP Super Cache 緩存,這時候在 WP Super Cache 的「內容」里就可以看到 memcached 對象緩存已經生效了所以不顯示緩存列表了。如下圖:

這是細心的站長們應該發現了 WP Super Cache 提示「Mod rewrite 模塊可能未安裝!」(如下圖所示),這個好像是 WP Super Cache 默認僅支持 Apache 造成的,使用 Nginx 的話一定會看到這個提示的,但是經過明月的測試,發現是沒有任何的影響的,基本可以暫時無視,當然網上也有很多這個問題的rewrite 配置大家可以自行百度參考設置,反正我是沒有設置的,目前看運行良好。

更新

可以通過在 function.php 里添加下面的代碼來屏蔽 WP Super Cache 里這個提示的:

  1. //禁止 WP Super Cache 顯示「Mod rewrite 模塊可能未安裝!」
  2. add_filter(got_rewrite, nginx_has_rewrites);
  3. function nginx_has_rewrites() {
  4. return true;
  5. }

W3 Total Cache 中開啟對 memcached 的支持

相對於 WP Super Cache 來看 W3 Total Cache 對 memcached 的支持可以說是大幅的提升了,因為在 W3 Total Cache 里 Page cache 、 Minify 、 Database Cache 、 Object Cache 、Fragment Cache 都可以支持 memcached 。從這點上來說 W3 Total Cache 相對於 WP Super Cache 來說檔次提升了不少,我是蠻喜歡的。 W3 Total Cache 里開啟 memcached 的支持可以說是很簡單了,只要在 General Setings 里上述的模塊了選擇 memcached 並保存就可以了,在前端輸出的 HTML 源碼里可以看到如下圖:

每種緩存模塊結尾都註明了「using memcached」即表示已經成功了。

memcached 探針(實時狀態監控)的使用

為了更好的獲取 memcached 的運行狀態,大家還可以使用 http://pecl.php.net/get/memcache-3.0.8.tgz 里提供的 memcache.php 來實現,安裝很簡單,只需要將這個 PHP 文件放到一個你知道的目錄,然後在瀏覽器里調用即可,並且此文件還支持賬號、密碼設定只有你自己可以查看的。

解壓後,裡面有一個 memcache.php 文件,編輯並找到如下代碼:

  1. define(ADMIN_USERNAME,memcache); // Admin Username
  2. define(ADMIN_PASSWORD,password); // Admin Password
  3. define(DATE_FORMAT,Y/m/d H:i:s);
  4. define(GRAPH_SIZE,200);
  5. define(MAX_ITEM_DUMP,50);
  6. $MEMCACHE_SERVERS[] = mymemcache-server1:11211; // add more as an array
  7. $MEMCACHE_SERVERS[] = mymemcache-server2:11211; // add more as an array

修改如下:

  1. define(ADMIN_USERNAME,memcache); // Admin Username 登錄名稱,自行修改
  2. define(ADMIN_PASSWORD,password); // Admin Password 登錄密碼,自行修改
  3. define(DATE_FORMAT,Y/m/d H:i:s);
  4. define(GRAPH_SIZE,200);
  5. define(MAX_ITEM_DUMP,50);
  6. //下面是定義memcached伺服器,一般我們是單機部署,所以注釋掉一行,並將伺服器地址根據實際修改,比如本文是127.0.0.1
  7. $MEMCACHE_SERVERS[] = 127.0.0.1:11211; // add more as an array
  8. //$MEMCACHE_SERVERS[] = mymemcache-server2:11211; // add more as an array

然後輸入指向這個文件的網址鏈接在瀏覽器里輸入賬號和密碼後就可以看到如下圖所示的 memcached的運行狀態了,話說 Hits 命中率還是很高的嘛!

最後一個小提示, memcached 默認內存使用的是 64MB 的,如果你感覺有點兒不夠用,在 LNMP 環境下可以修改 /etc/init.d/memcached 文件里的參數來增加內存量的。修改完成記得要重啟一下 memcached 哦!

目前,明月兩個站點根據情況分別用著 WP Super Cache 和 W3 Total Cache ,至少目前來看還是很穩定的,載入速度也是很滿意的,先測試運行幾天看看具體的實測效果,當然在開啟了靜態化緩存後,必不可少的 CDN 也是要有的,至於為啥還要用 CDN ,老站長們都懂的,誰讓我們活在一個「黑暗森林法則」的互聯網世界裡呢。

更新追加:

在伺服器端部署 Memcached 的時候一定要針對一個站點運行一個 Memcached 進程,如果有綁定的內網IP就用內網IP作為 Memcached 的IP來使用(使用127.0.0.1還是有一些安全隱患的),這樣安全性上提升很大,甚至可以限定只有主機IP才可以訪問 Memcached 的埠這樣最好。理論上 Redis 也可以這樣來使用的,有空了再試試 W3 Total Cache + Redis 的組合,可惜 WP Super Cache 好像不支持 Redis ,好尷尬呀!


推薦閱讀:

讓Python加速的方法,及一些優化代碼的工具(NumPy,PyPy,PyCUDA和Cython等)。
這一次,我不會推薦您使用CDN服務

TAG:WordPress | memcached缓存 | 加速 |