導讀:正好手頭有一個需求就是需要輕度的資料快取,因此嘗試了一把 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 種安裝方式任選其一:
①、線上安裝
- #Centos 直接使用 yum 安裝即可,其他系統自行搜尋安裝命令,比如 ubuntu
- yum -y install memcached
- #啟動 memcached
- service memcached start
- #開機啟動
- chkconfig memcached on
②、編譯安裝
相比線上安裝,很多時候編譯安裝更加靈活,非常類似 Windows 平臺的自定義安裝或綠色安裝,推薦熟悉 Linux 系統的朋友使用:
- #從官方下載最新原始碼包
- wget http:
- #解壓開始編譯安裝
- tar xzvf memcached-1.4.15.tar.gz
- cd memcached-1.4.15
- ./configure --prefix=/usr/local/memcached
- make && make install
- cd ..
- #設定環境
- ln -s /usr/local/memcached/bin/memcached /usr/bin/memcached
- cp scripts/memcached.sysv /etc/init.d/memcached
- #改為監聽 127.0.0.1,並關閉 UDP 連線方式,若為遠端服務呼叫或不需要的話請跳過此行
- sed -i 's/OPTIONS=""/OPTIONS="-l 127.0.0.1 -U 0"/g' /etc/init.d/memcached
- sed -i 's@chown@#chown@' /etc/init.d/memcached
- sed -i 's@/var/run/memcached/memcached.pid@/var/run/memcached.pid@' /etc/init.d/memcached
- #啟動並設定開機服務
- chmod +x /etc/init.d/memcached
- service memcached start
- chkconfig --add memcached
- 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 即可解決
- yum install cyrus-sasl-devel
接著開始編譯安裝 libmemcached:
- wget https:
- tar xzf libmemcached-1.0.18.tar.gz
- cd libmemcached-1.0.18
- ./configure --with-memcached=/usr/local/memcached --prefix=/usr/local/libmemcached
- make && make install
- cd ..
②、安裝 php-memcached 元件
下載和解壓這步,我們要區分下是 php7 還是之前的版本:
I 、如果當前環境是 php7 :
- #從 github 下載 PHP7 專用的 memcached 元件分支
- wget https:
- #解壓備用
- unzip php7.zip
- cd php-memcached-php7
II 、如果是之前的 php 版本:
- #從官方下載 php-memcached 的最新原始碼包
- wget http:
- #解壓和編譯
- tar zxvf memcached-2.2.0.tgz
- cd memcached-2.2.0
接下來開始編譯:
- #注意已有 php 的實際路徑
- /usr/local/php/bin/phpize
- ./configure --with-php-config=/usr/local/php/bin/php-config
- make && make install
編輯 php.ini 檔案,在最後插入如下引數
- extension=memcached.so
Ps:找不到 php.ini ? 很簡單執行命令:php --ini 即可找到,不信你試試。
儲存後,執行如下命令看看是否載入成功:
- php -m | grep memcached
如果輸出 memcached 則表示成功。
最後,如果是 Nginx 就 service php-fpm reload ,如果是 Apache 就重啟 Apache 完成安裝。
③、測試快取
- <?php
- $m = new Memcached();
- $m->addServer( '127.0.0.1', 11211 );
- $m->set( 'foo', 100 );
- 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 檔案,編輯並找到如下程式碼:
- define('ADMIN_USERNAME','memcache');
- define('ADMIN_PASSWORD','password');
- define('DATE_FORMAT','Y/m/d H:i:s');
- define('GRAPH_SIZE',200);
- define('MAX_ITEM_DUMP',50);
- $MEMCACHE_SERVERS[] = 'mymemcache-server1:11211';
- $MEMCACHE_SERVERS[] = 'mymemcache-server2:11211';
修改如下:
- define('ADMIN_USERNAME','memcache');
- define('ADMIN_PASSWORD','password');
- define('DATE_FORMAT','Y/m/d H:i:s');
- define('GRAPH_SIZE',200);
- define('MAX_ITEM_DUMP',50);
- $MEMCACHE_SERVERS[] = '127.0.0.1:11211';
上傳到網站私密目錄 (臨時測試可以放到根目錄),然後透過前臺訪問 memcache.php 這個檔案,輸入上面的使用者名稱和密碼即可看到 memcached 狀態:

4 、更多設定
如果發現頁面可以開啟,但是裡面沒有 Hits 資料,說明 WordPress 並沒有成功連線到 memcached,這時候我們可以在 wp-config.php 加入如下引數:
- global $memcached_servers;
- $memcached_servers = array(
- array(
- '127.0.0.1',
- 11211
- )
- );
實際的 memcached 監聽 IP 和埠,你可以透過如下命令檢視:
- 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 中啟用快取:
- define('WP_CACHE', true);
3 、引數調整
- var $max_age = 3600;
- var $remote = 0;
- var $times = 2;
- var $seconds = 0;
max_age 代表快取過期時間 (以秒為單位),times 表示訪問多少次才建立快取 (2 是最小值),seconds 表示在多少秒之後才建立快取 (0 表示立即) 。
我目前也只是要用到 memcache 的動態快取,所以對於 batcache 也只是初步瞭解狀態,感興趣的朋友可以自行搜尋學習更多相關設定。
來源:http://zhangge.net/5097.html