導讀:正好手頭有一個需求就是需要輕度的資料快取,因此嘗試了一把 memcached,簡單分享下部署過程及遇到的報錯和解決。一、 d 還是不 d 說到 php 的 memc...

正好手頭有一個需求就是需要輕度的資料快取,因此嘗試了一把 memcached,簡單分享下部署過程及遇到的報錯和解決。

一、 d 還是不 d

說到 php 的 memcached 和 memcache 元件,百度一搜都會教你如何安裝 memcache(d),然後很多人就照著做,做到最後發現不對,試了半天雖然搞定了,但還是不知道到底有 d 還是沒有 d,比如這位部落格仁兄的經驗分享:

為什麼他選第二個不行?其實 php 的這 2 個元件還是有點區別的:

簡單來說:

memcache 是 pecl 擴充套件庫版本,原生支援 php,出現更早,是老前輩;

memcached 是 libmemcached 版本,出現較後,是新一代,因此也更加完善,推薦使用。

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

其實,我們這種小網站的話,二選一即可,這點 QPS 還不至於糾結。不過一旦選擇了,安裝的時候就要注意區分,一對一配套安裝,別搞的牛頭不對馬嘴,出現上面那位仁兄的困惑 (後文有相關說明) 。

這裡,我果斷選擇了帶 d 的,繼續分享。

二、部署 memcached

1 、安裝 memcached

Ps:說到這裡又殺出一個容易混淆的程咬金。這裡要安裝的 memcached 是指 Mencached 的服務端,用來處理快取資料。

下面 2 種安裝方式任選其一:

①、線上安裝

  1. #Centos 直接使用 yum 安裝即可,其他系統自行搜尋安裝命令,比如 ubuntu 
  2. yum -y install memcached 
  3.  
  4. #啟動 memcached 
  5. service memcached start 
  6.  
  7. #開機啟動 
  8. chkconfig memcached on 

②、編譯安裝

相比線上安裝,很多時候編譯安裝更加靈活,非常類似 Windows 平臺的自定義安裝或綠色安裝,推薦熟悉 Linux 系統的朋友使用:

  1. #從官方下載最新原始碼包 
  2. wget http: 
  3.  
  4. #解壓開始編譯安裝 
  5. tar xzvf memcached-1.4.15.tar.gz 
  6. cd memcached-1.4.15 
  7. ./configure --prefix=/usr/local/memcached 
  8. make && make install 
  9. cd .. 
  10.  
  11. #設定環境 
  12. ln -s /usr/local/memcached/bin/memcached /usr/bin/memcached 
  13. cp scripts/memcached.sysv /etc/init.d/memcached 
  14.  
  15. #改為監聽 127.0.0.1,並關閉 UDP 連線方式,若為遠端服務呼叫或不需要的話請跳過此行 
  16. sed -i 's/OPTIONS=""/OPTIONS="-l 127.0.0.1 -U 0"/g' /etc/init.d/memcached 
  17.  
  18. sed -i 's@chown@#chown@' /etc/init.d/memcached 
  19. sed -i 's@/var/run/memcached/memcached.pid@/var/run/memcached.pid@' /etc/init.d/memcached 
  20.  
  21. #啟動並設定開機服務 
  22. chmod +x /etc/init.d/memcached 
  23. service memcached start 
  24. chkconfig --add memcached 
  25. chkconfig memcached on 

至此 memcached 的服務端就安裝好了。

2 、整合 php-memcached 拓展

①、先安裝 libmemcached

先提前分享一個問題,如果直接按照網上的教程安裝 php-memcached 可能會報如下錯誤:
configure: error: no, sasl.h is not available. Run configure with --disable-memcached-sasl to disable this check

先看看 SASL 是什麼?

SASL 全稱 Simple Authentication and Security Layer,是一種用來擴充 C/S 模式驗證能力的機制。
簡單來說 SASL 是一個膠合 (glue) 庫,透過這個庫把應用層與形式多樣的認證系統整合在一起。這有點類似於 PAM,但是後者是認證方式,決定什麼人可以訪問什麼服務,而 SASL 是認證過程,側重於信任建立過程,這個過程可以呼叫 PAM 來建立信任關係。在這裡 Memcached 就是上面提到的應用層,具體的認證交給 SASL 庫,SASL 會根據相應的認證機制來完成驗證功能。

果然,一般也用不到,所以大部分教程都是使用錯誤提示中的 --disable-memcached-sasl 來停用張戈功能,作為一個強迫症,我還是從國外的論壇扒到了解決方法,很簡單,在編譯 libmemcached 之前,先安裝 cyrus-sasl-devel 即可解決

  1. yum install cyrus-sasl-devel 

接著開始編譯安裝 libmemcached:

  1. wget https: 
  2. tar xzf libmemcached-1.0.18.tar.gz 
  3. cd libmemcached-1.0.18 
  4. ./configure --with-memcached=/usr/local/memcached --prefix=/usr/local/libmemcached 
  5. make && make install 
  6. cd .. 

②、安裝 php-memcached 元件

下載和解壓這步,我們要區分下是 php7 還是之前的版本:

I 、如果當前環境是 php7 :

  1. #從 github 下載 PHP7 專用的 memcached 元件分支 
  2. wget https: 
  3. #解壓備用 
  4. unzip php7.zip 
  5. cd php-memcached-php7 

II 、如果是之前的 php 版本:

  1. #從官方下載 php-memcached 的最新原始碼包 
  2. wget http: 
  3.  
  4. #解壓和編譯 
  5. tar zxvf memcached-2.2.0.tgz 
  6. cd memcached-2.2.0 

接下來開始編譯:

  1. #注意已有 php 的實際路徑 
  2. /usr/local/php/bin/phpize 
  3. ./configure --with-php-config=/usr/local/php/bin/php-config 
  4. make && make install 

編輯 php.ini 檔案,在最後插入如下引數

  1. extension=memcached.so 

Ps:找不到 php.ini ? 很簡單執行命令:php --ini 即可找到,不信你試試。

儲存後,執行如下命令看看是否載入成功:

  1. php -m | grep memcached 

如果輸出 memcached 則表示成功。

最後,如果是 Nginx 就 service php-fpm reload ,如果是 Apache 就重啟 Apache 完成安裝。

③、測試快取

  1. <?php 
  2. $m = new Memcached(); 
  3. $m->addServer( '127.0.0.1', 11211 ); 
  4. $m->set( 'foo', 100 ); 
  5. echo $m->get( 'foo' ) . "
    "

將上述程式碼儲存為 test.php,然後執行 php -f test.php,如果能輸出 100 表示安裝成功。

三、 WordPress 快取

做完上述所有步驟,還只能說明系統環境已經支援了 memcached 快取。下面我們還要將這個快取用起來才行。

1 、埋坑警報

值得說明的是,這裡還有一個大坑等著你來踩:

WordPress 官網上的 object-cache.php 雖然也號稱 Memcached 外掛,然而它只支援 Memcache,不支援新版的,所以不能使用。如果錯誤地將 object-cache.php 和 Memcached 混用的話,則會出現 WordPress 打不開,前臺後臺頁面一片空白的現象。

這也就是經常有站長反饋 WordPress 啟用 memcached 功能後,頁面空白的錯誤原因了。不巧,張戈在測試的時候也踩坑了,所以特別提出來,希望大家瞭解錯誤的原因,規避掉!

2 、安裝外掛

所以,如果你一開始選擇的是不帶 d 的 memcache,那麼直接用 WordPress 官方的 object-cache.php 外掛即可!如果你選擇的是帶 d 的 memcached,那麼這裡就不能用官方的外掛,而是要用 github 版本:

https://github.com/tollmanz/WordPress-pecl-memcached-object-cache

在這裡下載並解壓得到的 object-cache.php,上傳到 wp-content 目錄即可開啟 memcached 快取。當然,不管是帶 d 的還是不帶 d 的,記得都是上傳到 wp-content 目錄。

3 、檢視效果

做完第 2 步之後,你可以去網站前臺重新整理幾次,產生快取,然後從官方下載探針:

http://pecl.php.net/get/memcache-3.0.8.tgz

解壓後,裡面有一個 memcache.php 檔案,編輯並找到如下程式碼:

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

修改如下:

  1. define('ADMIN_USERNAME','memcache');     
  2. define('ADMIN_PASSWORD','password');     
  3. define('DATE_FORMAT','Y/m/d H:i:s'); 
  4. define('GRAPH_SIZE',200); 
  5. define('MAX_ITEM_DUMP',50); 
  6.  
  7. $MEMCACHE_SERVERS[] = '127.0.0.1:11211' 
  8.  

上傳到網站私密目錄 (臨時測試可以放到根目錄),然後透過前臺訪問 memcache.php 這個檔案,輸入上面的使用者名稱和密碼即可看到 memcached 狀態:

4 、更多設定

如果發現頁面可以開啟,但是裡面沒有 Hits 資料,說明 WordPress 並沒有成功連線到 memcached,這時候我們可以在 wp-config.php 加入如下引數:

  1. global $memcached_servers
  2. $memcached_servers = array
  3.     array
  4.         '127.0.0.1' 
  5.          11211         
  6.     ) 
  7. ); 

實際的 memcached 監聽 IP 和埠,你可以透過如下命令檢視:

  1. netstat -nutlp | grep memcache 

四、純靜態快取

實際上 memcached 可以快取動態查詢資料,他也可以快取 html 內容!所以說,memcached 也能實現和其他方案原因的 html 純淨態快取!實現原理和我之前分享的 php 程式碼快取 html 方案類似,不過後者更好的是將快取內容放在了記憶體當中,速度比放硬碟快的絕對不是一點點。

如何將前臺頁面 html 都快取到 memcached 中呢?這裡,我們需要用到 batcache 這款外掛。

1 、下載安裝

直接在 WordPress 後臺搜尋安裝 batcache ,也可以從官方下載外掛包:

https://WordPress.org/plugins/batcache/

然後解壓得到 advanced-cache.php 上傳到 wp-content 即可。

2 、啟用快取

在 wp-config.php 中啟用快取:

  1. define('WP_CACHE', true); 

3 、引數調整

  1. var $max_age =  3600;  
  2. var $remote  =    0;  
  3. var $times   =    2;  
  4. var $seconds =  0;  

max_age 代表快取過期時間 (以秒為單位),times 表示訪問多少次才建立快取 (2 是最小值),seconds 表示在多少秒之後才建立快取 (0 表示立即) 。

我目前也只是要用到 memcache 的動態快取,所以對於 batcache 也只是初步瞭解狀態,感興趣的朋友可以自行搜尋學習更多相關設定。

來源:http://zhangge.net/5097.html