天天看點

基于libmemcached,php擴充memcached的安裝

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 

以上說明,已成功安裝