如今互聯網崛起的時代,各大網站都面臨著一個大數據流問題,怎麼提高網站訪問速度,減少對數據庫的操作;作為PHP開發人員,我們一般能想到的方法有頁面靜態化處理、防盜鏈、CDN內容分發加速訪問、mysql數據庫優化建立索引、架設apache服務器集群()、還有就是現在流行的各種分布式緩存技術:如memcached/redis;
1.什麼是Memcached?
a.Memcached 是一個高性能的分布式內存對象緩存系統,用於動態Web應用以減輕數據庫負載。它通過在內存中緩存數據和對象來減少讀取數據庫的次數,從而提高動態、數據庫驅動網站的速度。Memcached基於一個存儲鍵/值對的hashmap。其守護進程(daemon )是用C寫的,但是客戶端可以用任何語言來編寫,並通過memcached協議與守護進程通信。
b.Memcached的鍵key一般是字符串,該值不能重復;value可以放入字符串、數組、數值、對象、布爾,二進制數據和圖片視頻
c.Memcached默認服務端口是11211
2.PHP使用Memcached步驟
<1>准備:下載Memcached服務安裝包:memcached-1.2.6-win32-bin.7z和訪問Memcached服務的dll庫:php_memcache.dll
www.memcached.org(官網進不去好像,可以從其他地方下載)
<2>解壓包memcached-1.2.6-win32-bin.7z(可以解壓完復制放到web服務器同級目錄),然後操作cmd,進入到剛才解壓的目錄用命令安裝:memcached.exe -d install
<3>安裝完(判斷是否安裝完畢可以到服務列表裡面查看是否有memcached服務),然後cmd用命令啟動:memcached.exe -d start
具體操作如下:
<4>啟動完memcached服務後,再把下載的php_memcache.dll放到web服務器php5目錄下的ext目錄下
<5>在php.ini裡面修改,加載擴展庫php_memcache.dll,然後重啟apache服務器
<6>開始實踐,memcached主要有crud操作(即創建、讀取、更新、刪除值操作,具體可以查閱手冊),下面弄個簡單的設置值,然後讀取值的操作
a.設置值頁面
connect("127.0.0.1")) { echo "連接Memcache服務器失敗!"; } //設置,'myword'參數代表鍵key,'hello world'代表存放的值,MEMCACHE_COMPRESSED代表壓縮內容,50代表存放時間,單位秒 if ($mem->set('myword','hello world',MEMCACHE_COMPRESSED,50)) { echo "設置值成功!"; } ?>
注:如果值在內存存放的時間要超過30天,要用時間戳來設置100天:如time()+3600*24*100;設置0則表示永不過期
b.讀取值頁面
connect("127.0.0.1")) { echo "連接Memcache服務器失敗!"; } //讀取鍵myword值 $value = $mem->get('myword'); if(!$value) { echo "讀取失敗!"; } else { echo "讀取的值=".$value; }
connect("127.0.0.1")) { echo "連接Memcache服務器失敗!"; } //設置,'myword'參數代表鍵key,'hello world'代表存放的值,MEMCACHE_COMPRESSED代表壓縮內容,50代表存放時間,單位秒 if ($mem->set('myword','hello world',MEMCACHE_COMPRESSED,50)) { echo "設置值成功!"; } //讀取鍵myword值 $value = $mem->get('myword'); if(!$value) { echo "讀取失敗!"; } else { echo "讀取的值=".$value; } //更新鍵值 $mem->replace('myword','hello everybody!'); $value = $mem->get('myword'); if(!$value) { echo "讀取失敗!"; } else { echo "讀取的值=".$value; } //刪除鍵myword值 $mem->delete('myword'); $value = $mem->get('myword'); if(!$value) { echo "讀取失敗!"; } else { echo "讀取的值=".$value; } //關閉 $mem->close(); ?>
<7>多個memcached服務器設置,其實就比一個memcached服務器改變一點點,就是把多個memcached的服務器通過方法addserver添加到連接池中,這樣設置完後,crud操作時,內部就會通過相應算法均衡連接相應服務器並執行相應操作中。
addserver('192.168.0.1',11211); $mem->addserver('192.168.0.2',11211); $mem->addserver('192.168.0.3',11211); $mem->addserver('192.168.0.4',11211); //設置,'myword'參數代表鍵key,'hello world'代表存放的值,MEMCACHE_COMPRESSED代表壓縮內容,50代表存放時間,單位秒 if ($mem->set('myword','hello world',MEMCACHE_COMPRESSED,50)) { echo "設置值成功!"; } //讀取鍵myword值 $value = $mem->get('myword'); if(!$value) { echo "讀取失敗!"; } else { echo "讀取的值=".$value; } ?>
<8>memcache的訪問是無用戶狀態,安全性需要考慮,一般通過放在內網,並通過防火牆限制外網訪問memcache端口來達到安全
<9>通過修改php.ini,可以把session的值放入memcache服務器中
session.save_handler = files改成session.save_handler = memcached
session.save_path = "N;MODE;/path"改成 session.save_path = "tcp://127.0.0.1:11211"