php memcached(windows linux) 的安裝及應用 2011-04-08

一. Linux 下安裝

    1. 首先是下載 memcached 了,目前最新版本是 1.2.1,直接從官方網站即可下載到 memcached-1.2.1.tar.gz 。
            除此之外,memcached 用到了 libevent ,我下載的 是 libevent-1.3a.tar.gz。

            memcached官方版本下載地址:http://www.danga.com/memcached/
            libevent官方版本下載地址:http://monkey.org/~provos/libevent/

    2. 接下來是分別將 libevent-1.3a.tar.gz 和 memcached-1.2.1.tar.gz 解開包、編譯、安裝:
            我安裝memcached 在 /usr/bin/memcached位置。複製內容到剪貼板代碼:            # tar -xzf libevent-1.3a.tar.gz
            # cd libevent-1.3a
            # ./configure --prefix=/usr
            # make
            # make install
            # cd ..
            # tar -xzf memcached-1.2.1.tar.gz
            # cd memcached-1.2.1
            # ./configure --prefix=/usr
            # make
            # make installNOTE: 如果 libevent 不是安裝在 /usr 目錄下,那麼需要把 libevent-1.2a.so.1 拷貝/鏈接(ls -s /usr/local/lib/libevent-1.1.so.1 /usr/lib)到 /usr/lib 中,否則memcached 無法正常加載。運行以下命令來啓動 memcached。

    3. 運行 memcached 守護程序
            運行 memcached 守護程序很簡單,只需一個命令行即可,不需要修改任何配置文件(也沒有配置文件給你修改            ):

            #/usr/bin/memcached -d -m 128 -l 192.168.1.117 -p 11211 -u nobody複製內容到剪貼板代碼:           /usr/bin/memcached -d -m 128 -l 192.168.1.117 -p 11211 -u httpd
            參數解釋:
            -d 以守護程序(daemon)方式運行 memcached;
            -m 設置 memcached 可以使用的內存大小,單位爲 M;
            -l 設置監聽的 IP 地址,如果是本機的話,通常可以不設置此參數;
            -p 設置監聽的端口,默認爲 11211,所以也可以不設置此參數;
            -u 指定用戶,如果當前爲 root 的話,需要使用此參數指定用戶。當然,還有其它參數可以用,man memcached 一下就可以看到了。


    4. 編譯PHP configure加上 –enable-memcache[=DIR] 選項。我以前都是靜態安裝 PHP模塊,此次 安裝memcache PHP模塊採用動態模塊(DSO)方式

          memcache PHP模塊下載地址:http://pecl.php .net/package/memcache複製內容到剪貼板代碼:          # tar -vxzf memcache-1.5.tgz
          # cd memcache-1.5
          # /usr/local/php/bin/phpize
          # ./configure --enable-memcache --with -php-config=/usr/local/php/bin/php-config --with-zlib-dir
          # make
          # make install

安裝完後會有類似這樣的提示:
          Installing shared extensions: /usr/local/php/lib/php/extensions/no-debug-non-zts-20050922/

          把這個記住
          然後修改php.ini
          把
          extension_dir = "./"
          修改爲
          extension_dir = "/usr/local/php/lib/php/extensions/no-debug-non-zts-20050922/"

          並添加一行
          extension=memcache.so
   
二. Windows 下安裝

  

1. 下載memcache的windows穩定版,解壓放某個盤下面,比如在c:\memcached

2. 在終端(也即cmd命令界面)下輸入 ‘c:\memcached\memcached.exe -d install’ 安裝

3. 再輸入: ‘c:\memcached\memcached.exe -d start’ 啓動。NOTE: 以後memcached將作爲windows的一個服務每次開機時自動啓動。這樣服務器端已經安裝完畢了。

4.下載http://pecl4win.php.net/ext.php/php_memcache.dll,

請自己查找對應的php版本的文件

5. 在C:\winnt\php.ini加入一行 ‘extension=php_memcache.dll’

6.重新啓動Apache,然後查看一下phpinfo,如果有memcache,那麼就說明安裝成功!



三、 memcache與memcached的比較

    memcached 會比 memcache 多幾個方法,使用方式上都差不多。

    http://stackoverflow.com/questions/1442411/using-memcache-vs-memcached-with-php

    memcached 實現了更多的 memcached 協議(畢竟是基於 libmemcached 庫的)。

    http://serverfault.com/questions/63383/memcache-vs-memcached

   

memcached 的版本比較新,而且使用的是 libmemcached 庫。libmemcached 被認爲做過更好的優化,應該比 php only 版本的 memcache 有着更高的性能。

這裏有另外一個對比表,很明顯,用 memcached 會讓人放心很多:
http://code.google.com/p/memcached/wiki/PHPClientComparison
差別比較大的一點是,memcached 支持 Binary Protocol,而 memcache 不支持,意味着 memcached 會有更高的性能。不過,還需要注意的是,memcached 目前還不支持長連接:在這裏,我推薦大家使用 memcached三、 membercache服務端的一些參數

memcached的基本設置

-p 監聽的端口
-l 連接的IP地址, 默認是本機
-d start 啓動memcached服務
-d restart 重起memcached服務
-d stop|shutdown 關閉正在運行的memcached服務
-d install 安裝memcached服務
-d uninstall 卸載memcached服務
-u 以的身份運行 (僅在以root運行的時候有效)
-m 最大內存使用,單位MB。默認64MB(設置MEMCACHE大小)
-M 內存耗盡時返回錯誤,而不是刪除項
-c 最大同時連接數,默認是1024
-f 塊大小增長因子,默認是1.25
-n 最小分配空間,key+value+flags默認是48
-h 顯示幫助

MEMCACHE測試代碼

<?php
$memcache = new Memcache;
$memcache->connect('127.0.0.1', 11211) or die ("Could not connect");
$version = $memcache->getVersion();
echo "Server's version: ".$version."\n";
$tmp_object = new stdClass;
$tmp_object->str_attr = 'test';
$tmp_object->int_attr = 123;
$memcache->set('key', $tmp_object, false, 10) or die ("Failed to save data at the server");
echo "Store data in the cache (data will expire in 10 seconds)\n";
$get_result = $memcache->get('key');
echo "Data from the cache:\n";
var_dump($get_result);
?>

運行後輸出如下:

Server's version: 1.2.6 Store data in the cache (data will expire in 10 seconds) Data from the cache: object(stdClass)#3 (2) { ["str_attr"]=> string(4) "test" ["int_attr"]=> int(123) }

php.ini中的配置:
[Memcache]
; 一個高性能的分佈式的內存對象緩存系統,通過在內存裏維護一個統一的巨大的hash表,
; 它能夠用來存儲各種格式的數據,包括圖像、視頻、文件以及數據庫檢索的結果等。
; 是否在遇到錯誤時透明地向其他服務器進行故障轉移。
memcache.allow_failover = On
; 接受和發送數據時最多嘗試多少個服務器,只在打開memcache.allow_failover時有效。memcache.max_failover_attempts = 20
; 數據將按照此值設定的塊大小進行轉移。此值越小所需的額外網絡傳輸越多。
; 如果發現無法解釋的速度降低,可以嘗試將此值增加到32768。
memcache.chunk_size = 8192
; 連接到memcached服務器時使用的默認TCP端口。
memcache.default_port = 11211
; 控制將key映射到server的策略。默認值"standard"表示使用先前版本的老hash策略。
; 設爲"consistent"可以允許在連接池中添加/刪除服務器時不必重新計算key與server之間的映射關係。
;memcache.hash_strategy = "standard"; 控制將key映射到server的散列函數。默認值"crc32"使用CRC32算法,而"fnv"則表示使用FNV-1a算法。
; FNV-1a比CRC32速度稍低,但是散列效果更好。
;memcache.hash_function = "crc32"
;memcache也可以作爲session的存儲模塊,具體參看:memcache PHP 的 session.save_handler.

Memcache的安全

我們上面的Memcache服務器端都是直接通過客戶端連接後直接操作,沒有任何的驗證過程,這樣如果服務器是直接暴露在互聯網上的話是比較危險,輕則數據泄露被其他無關人員查看,重則服務器被***,因爲Mecache是以root權限運行的,況且裏面可能存在一些我們未知的bug或者是緩衝區溢出的情況,這些都是我們未知的,所以危險性是可以預見的。爲了安全起見,我做兩點建議,能夠稍微的防止***的***或者數據的泄露。

內網訪問
最好把兩臺服務器之間的訪問是內網形態的,一般是Web服務器跟Memcache服務器之間。普遍的服務器都是有兩塊網卡,一塊指向互聯網,一塊指向內網,那麼就讓Web服務器通過內網的網卡來訪問Memcache服務器,我們Memcache的服務器上啓動的時候就監聽內網的IP地址和端口,內網間的訪問能夠有效阻止其他非法的訪問。
# memcached -d -m 1024 -u root -l 192.168.0.200 -p 11211 -c 1024 -P /tmp/memcached.pid
Memcache服務器端設置監聽通過內網的192.168.0.200的ip的11211端口,佔用1024MB內存,並且允許最大1024個併發連接

設置防火牆
防火牆是簡單有效的方式,如果卻是兩臺服務器都是掛在網的,並且需要通過外網IP來訪問Memcache的話,那麼可以考慮使用防火牆或者代理程序來過濾非法訪問。
一般我們在Linux下可以使用iptables或者FreeBSD下的ipfw來指定一些規則防止一些非法的訪問,比如我們可以設置只允許我們的Web服務器來訪問我們Memcache服務器,同時阻止其他的訪問。
# iptables -F
# iptables -P INPUT DROP
# iptables -A INPUT -p tcp -s 192.168.0.2 –dport 11211 -j ACCEPT
# iptables -A INPUT -p udp -s 192.168.0.2 –dport 11211 -j ACCEPT
上面的iptables規則就是隻允許192.168.0.2這臺Web服務器對Memcache服務器的訪問,能夠有效的阻止一些非法訪問,相應的也可以增加一些其他的規則來加強安全性,這個可以根據自己的需要來做。

 

Memcache的使用
使用Memcache的網站一般流量都是比較大的,爲了緩解數據庫的壓力,讓Memcache作爲一個緩存區域,把部分信息保存在內存中,在前端能夠迅速的進行存取。那麼一般的焦點就是集中在如何分擔數據庫壓力和進行分佈式,畢竟單臺Memcache的內存容量的有限的。我這裏簡單提出我的個人看法,未經實踐,權當參考。

分佈式應用
Memcache本來支持分佈式,我們客戶端稍加改造,更好的支持。我們的key可以適當進行有規律的封裝,比如以user爲主的網站來說,每個用戶都有 User ID,那麼可以按照固定的ID來進行提取和存取,比如1開頭的用戶保存在第一臺Memcache服務器上,以2開頭的用戶的數據保存在第二胎 Mecache服務器上,存取數據都先按照User ID來進行相應的轉換和存取。

但是這個有缺點,就是需要對User ID進行判斷,如果業務不一致,或者其他類型的應用,可能不是那麼合適,那麼可以根據自己的實際業務來進行考慮,或者去想更合適的方法。

減少數據庫壓力
這個算是比較重要的,所有的數據基本上都是保存在數據庫當中的,每次頻繁的存取數據庫,導致數據庫性能極具下降,無法同時服務更多的用戶,比如 MySQL,特別頻繁的鎖表,那麼讓Memcache來分擔數據庫的壓力吧。我們需要一種改動比較小,並且能夠不會大規模改變前端的方式來進行改變目前的架構。

我考慮的一種簡單方法:
後端的數據庫操作模塊,把所有的Select操作提取出來(update/delete/insert不管),然後把對應的SQL進行相應的hash算法計算得出一個hash數據key(比如MD5或者SHA),然後把這個key去Memcache中查找數據,如果這個數據不存在,說明還沒寫入到緩存中,那麼從數據庫把數據提取出來,一個是數組類格式,然後把數據在set到Memcache中,key就是這個SQL的hash值,然後相應的設置一個失效時間,比如一個小時,那麼一個小時中的數據都是從緩存中提取的,有效減少數據庫的壓力。缺點是數據不實時,當數據做了修改以後,無法實時到前端顯示,並且還有可能對內存佔用比較大,畢竟每次select出來的數據數量可能比較巨大,這個是需要考慮的因素。


收藏於 2011-04-08

來自於百度空間


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章