導讀:正好手頭有一個需求就是需要輕度的數據緩存,因此嘗試了一把 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