php的memcache和memcached擴充差別
老生長談的問題了。我這裡就整理一下。
memcache的文檔在:http://pecl.php.net/package/memcache
memcached的文檔在:http://pecl.php.net/package/memcached
首先看下時間,memcache最早是在2004年2月開發的,最後更新是在2013年4月,而memcached最早是在2009年1月開發的,最後更新是在2014年1月更新的。是以memcache的曆史比memcached早。
在安裝memcache擴充的時候并不要求安裝其他東東,但是在安裝memcached的時候會要求你安裝libmemcached,問題來了,libmemcached是memcache的C用戶端,它具有的優點是低記憶體,線程安全等特點。比如新浪微網誌之前就全面将php的memcache替換成php的memcached,在高并發下,穩定性果斷提高。
memcache的方法清單在:http://cn2.php.net/memcache
memcached的方法清單在:http://www.php.net/manual/zh/book.memcached.php
memcache的方法特别少,比如getMulti,setMulti都是沒有的,基本就剩下最簡單的get和set了。是以說“memcached比memcache支援更多的memcache協定”。
然後memcached直接配置了session支援,隻要稍微修改下配置檔案就可以把session存儲在memcache中了。
################
一,為什麼要裝memcached擴充
memcached的1.2.4及以上增加了CAS(Check and Set)協定,對于同一key的多進行程的并發處理問題。這種情況其實根資料庫很像,如果同時有幾個程序對同一個表的同一資料進行更新的話,那會不會打架呢,哈哈。資料庫裡面可以鎖定整張表,也可以鎖定表裡面一 行的功能,其實memcached加入的CAS根這個差不多。
php的擴充memcache,不支援cas,是以我們要裝memcached擴充,memcached擴充是基于libmemcached,是以要先安裝libmemcached
二,檢視memcahced的版本資訊
telnet 127.0.0.1 12000
stats
你會看到有以下資訊
STAT pid 15322
STAT uptime 1885
STAT time 1279455772
STAT version 1.2.8
STAT pointer_size 32
如果版本過低,考慮重新裝一下
退出telnet ,ctrl + ] 然後在按q就行了。
三,安裝所要軟體
wget http://launchpad.net/libmemcached/1.0/0.42/+download/libmemcached-0.42.tar.gz
wget http://pecl.php.net/get/memcached-1.0.2.tgz
memcached的官方網站 http://www.memcached.org/
四,安裝libmemcached
tar zxvf libmemcached-0.42.tar.gz
cd libmemcached-0.42
./configure –prefix=/usr/local/libmemcached –with-memcached
make && make install
安裝要注意的問題:
1, 安裝過程中不要忘了,–with-memcached,不然會提示你
checking for memcached… no
configure: error: “could not find memcached binary”
2,你的memcached是不是1.2.4以上的,如果不是會提示你
clients/ms_thread.o: In function `ms_setup_thread’:
/home/zhangy/libmemcached-0.42/clients/ms_thread.c:225: undefined reference to `__sync_fetch_and_add_4′
clients/ms_thread.o:/home/zhangy/libmemcached-0.42/clients/ms_thread.c:196: more undefined references to `__sync_fetch_and_add_4′ follow
collect2: ld returned 1 exit status
make[2]: *** [clients/memslap] Error 1
make[2]: Leaving directory `/home/zhangy/libmemcached-0.42′
解決辦法是–disable-64bit CFLAGS=”-O3 -march=i686″,
如果不用這個64位的long型資料,我想php擴充memcached,memcache也就沒什麼差別了,裝memcached也就沒什麼意思了。
五,php的擴充memcached的安裝
tar zxvf memcached-1.0.2.tar.gz
cd memcached-1.0.2
/usr/local/php/bin/phpize
./configure --prefix=/usr/local/phpmemcached --with-memcached -with-php-config=/usr/local/php/bin/php-config --with-libmemcached-dir=/usr/local/libmemcached --enable-memcached
make && make install
vi /usr/local/php/lib/php.ini
加上extension=memcached.so重起一下服務就可以了。
########################################################################################
說明:由于一些開源網址有所變化,以及版本也有所變化,是以,這裡給出了本年度最新下載下傳網址,以及最新的版本。
本安裝文檔所用的作業系統是CentOS.
1、為什麼要裝memcached擴充
memcached的1.2.4及以上增加了CAS(Check and Set)協定,對于同一key的多進行程的并發處理問題。這種情況其實根資料庫很像,如果同時有幾個程序對同一個表的同一資料進行更新的話,那會不會打架呢。資料庫裡面可以鎖定整張表[myisam],也可以鎖定表裡面一行[inodb]的功能,其實memcached加入的CAS與此差不多。
php的擴充memcache,不支援cas,是以我們要裝memcached擴充,memcached擴充是基于libmemcached,是以要先安裝libmemcached。但安裝之前,先要确認,是否有memcached服務端。
可用指令:
whereis memcached
如果能找到,則要檢查版本。
2、檢視memcahced的版本資訊
telnet 127.0.0.1 12000
stats
你會看到有以下資訊
STAT pid 15322
STAT uptime 1885
STAT time 1279455772
STAT version 1.2.8
STAT pointer_size 32
如果版本過低(低于memcached 1.2.4),考慮重新裝一下
退出telnet ,ctrl + ] 然後在按q就行了。
php的memcache擴充和memcached擴充的伺服器端程式均是memcached. 是以,無論是安裝memcache擴充還是memcached擴充,均需要先安裝libevent。關于memcache擴充和memcached擴充二者的差別,第一可以參考PHP文檔,其二,網上也有詳細講解。這裡不多講。以下是安裝步驟:
3、下載下傳所需軟體:
libevent官方網站是:http://www.monkey.org/~provos/libevent/
最新版是2.0.10 下載下傳:
curl -O http://www.monkey.org/~provos/libevent-2.0.10-stable.tar.gz
memcached的官方網址是:http://memcached.org/ 目前最新版本是1.4.5。
下載下傳:
wget http://memcached.googlecode.com/files/memcached-1.4.5.tar.gz
此外:memcached擴充還支援igninary。這是一個快速高效的序列化庫。官方網址是:
http://opensource.dynamoid.com/
目前最新版是 1.1.1,下載下傳網址是:
wget http://opensource.dynamoid.com/igbinary-1.1.1.tar.gz
libmemcached官方網站是(注意:PHP文檔中的網址己不可用,很久未更新了):
http://libmemcached.org/libMemcached.html
下載下傳網址是,這裡可以檢視最新版:
https://launchpad.net/libmemcached/+download
最新版本是0.46
wget http://launchpad.net/libmemcached/1.0/0.46/+download/libmemcached-0.46.tar.gz
雖然PHP預設安裝了JSON,但是,memcached如果要支援igbinary,則需要php_json的頭檔案。是以,要下載下傳pecl的 json-1.2.1.tgz(具體根據你PHP的版本而定,可以用PHPINFO檢視一下目前JSON的版本)
wget http://pecl.php.net/get/json-1.2.1.tgz
最後則是pecl的 memcached,這個直接查php文檔中的網址,最新版本是1.0.2
網址:http://pecl.php.net/package/memcached
下載下傳:
wget http://pecl.php.net/get/memcached-1.0.2.tgz
4、memcached服務端安裝:
如果系統中沒有memcached服務端或版本太低,則需要安裝。
(1)安裝libevent
tar xvfz libevent-2.0.10-stable.tar.gz
cd libevent-2.0.10-stable
./configure && make
make install
這裡選用的是預設路徑安裝,安裝後,libevent将會是在/usr/local/lib/目錄下
(2)安裝memcached服務端
tar zxvf memcached-1.4.5.tar.gz
cd memcached-1.4.5
./configure --with-libevent=/usr/local/lib
make
make install
這裡也是預設安裝,如果上一安裝指定了 --prefix,那麼,這裡需要用 --with-libevent=指定到相同的路徑。
服務端安裝結果測試:
/usr/local/bin/memcached -d -m 10 -p 11211 -u root
參數說明:
-d: (run as a daemon) 選項是啟動一個守護程序
-m:(max memory to use for items in megabytes (default: 64 MB))是配置設定給Memcache使用的記憶體數量,機關是MB,我這裡是100MB,
-u:(assume identity of <username> (only when run as root))是運作Memcache的使用者,我這裡是root,
-l:(interface to listen on)是監聽的伺服器IP位址,如果有多個位址的話,這裡指定了伺服器的IP位址127.0.0.1,
-p:是設定Memcache監聽的端口,這裡設定了11211,最好是1024以上的端口,
-c:選項是最大運作的并發連接配接數,預設是1024,這裡設定了256,根據伺服器的負載量來設定,
-P:(save PID in <file>, only used with -d option)是設定儲存Memcache的pid檔案,這裡是儲存在 /tmp/memcached.pid
注:如果啟動時出現“memcached: error while loading shared libraries: libevent-2.0.so.5: cannot open
shared object file: No such file or directory”之類的資訊,表示memcached找不到libevent的位置
是以,請先使用whereis libevent得到位置,然後連接配接到memcached所尋找的路徑
首先檢視,libevent在哪裡
[[email protected] tools]# whereis libevent
libevent: /usr/local/lib/libevent.la /usr/local/lib/libevent.so /usr/local/lib/libevent.a
然後,再看memcached從哪裡找它
[[email protected] tools]# LD_DEBUG=libs memcached -v 2>&1 > /dev/null | less
可以看到:是/usr/lib/libevent-2.0.so.5,是以,建立軟鍊
[[email protected] tools]# ln -s /usr/local/lib/libevent-2.0.so.5 /usr/lib/libevent-2.0.so.5
再次啟動,一定OK!關閉memcached :pkill memcached
5、igninary安裝:
在做下面操作之前,先查一下 phpize 和 php-config的路徑
whereis phpize
whereis php-config
然後,下面的指令中的路徑,參考以上的結果。
tar xvfz igbinary-1.1.1.tar.gz
cd igbinary-1.1.1
/usr/bin/phpize
./configure --with-php-config=/usr/bin/php-config --enable-igbinary
make && make install
修改配置:
方法1:
vi /usr/local/php/lib/php.ini
加上extension=igbinary.so重起一下服務就可以了。
方法2:(我個人喜好這一種方法)
最好的做法是在 /etc/php.d/添加一個檔案:igbinary.ini
vi /etc/php.d/igbinary.ini
寫入:extension=igbinary.so
注,igbinary提供了很好且快速的序列化函數。這是讓PHP可以使用inbinary的函數,如果你不需要,這個配置修改可以不做。
6、libmemcached安裝
tar zxvf libmemcached-0.46.tar.gz
cd libmemcached-0.46
./configure --prefix=/usr/local/libmemcached --with-memcached
如果是32位系統:
./configure --prefix=/usr/local/libmemcached --with-memcached --disable-64bit CFLAGS="-O3 -march=i686"
make && make install
安裝要注意的問題:
(1), 安裝過程中不要忘了,--with-memcached,不然會提示你
checking for memcached… no
configure: error: “could not find memcached binary”
(2),你的memcached是不是1.2.4以上的,64位系統,如果不是會提示你
clients/ms_thread.o: In function `ms_setup_thread’:
/home/zhangy/libmemcached-0.42/clients/ms_thread.c:225: undefined reference to `__sync_fetch_and_add_4′
clients/ms_thread.o:/home/zhangy/libmemcached-0.42/clients/ms_thread.c:196: more undefined references to `__sync_fetch_and_add_4′ follow
collect2: ld returned 1 exit status
make[2]: *** [clients/memslap] Error 1
make[2]: Leaving directory `/home/zhangy/libmemcached-0.42′
解決辦法是 --disable-64bit CFLAGS=”-O3 -march=i686″。
(3),--prefix=/usr/local/libmemcached也必須加上,否則libmemcached沒有自己的目錄,不好管理。
7、php的擴充memcached的安裝
先要處理json頭檔案:
tar zxvf json-1.2.1.tar.gz
cd /usr/include/php/ext #這是預設安裝路徑。如果你PHP自定義安裝,則要到其它路徑
mkdir json
cd ./json
cp /usr/local/src/json-1.2.1/php_json.h ./php_json.h
tar zxvf memcached-1.0.2.tar.gz
cd memcached-1.0.2
在做下面操作之前,先查一下 phpize 和 php-config的路徑
whereis phpize
whereis php-config
然後,下面的指令中的路徑,參考以上的結果。
/usr/local/php/bin/phpize
./configure --enable-memcached --enable-memcached-igbinary --with-php-config=/usr/local/php/bin/php-config --with-libmemcached-dir=/usr/local/libmemcached
./configure --prefix=/usr/local/phpmemcached --with-memcached
make && make install
注意:
--with-libmemcached-dir=/usr/local/libmemcached #與安裝libmemcached時指定的prefix一緻
修改配置,方法1:
vi /usr/local/php/lib/php.ini
加上extension=memcached.so重起一下服務就可以了。
方法2:最好的做法是在 /etc/php.d/添加一個檔案:memcached.ini
vi /etc/php.d/memcached.ini
寫入:extension=memcached.so
加這個檔案要注意檔案權限。否則,phpinfo中additional .ini files parsed 中沒有這個檔案時,證明權限不對,PHP不能打開這個檔案。
8、安裝成功後檢查:
重新開機系統:
service httpd restart
這時打開一個運作phpinfo函數的頁面,可檢視到以下結果:
additional .ini files parsed 這一欄中必須要有(注:確定修改配置時所用的是方法2,以下資訊才會有!):
/etc/php.d/igbinary.ini, 和 /etc/php.d/memcached.ini,
如果沒有後者,即/etc/php.d/memcached.ini, 則下面的資訊也沒有(但修改配置時所用的是方法1時除外)
memcached
memcached support enabled
Version 1.0.2
libmemcached version 0.46
Session support yes
igbinary support yes
以上說明,已成功安裝