PHP之分布式緩衝memcached熟悉和操作,php緩衝memcached
如今互連網崛起的時代,各大網站都面臨著一個大資料流問題,怎麼提高網站訪問速度,減少對資料庫的操作;作為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.設定值頁面
<?phpheader("Content-type:text/html;charset=utf-8");//建立Memcache對象$mem = new Memcache(); //串連Memcache伺服器if(!$mem->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.讀取值頁面
<?phpheader("Content-type:text/html;charset=utf-8");$mem = new Memcache(); if(!$mem->connect("127.0.0.1")) { echo "串連Memcache伺服器失敗!";}//讀取鍵myword值$value = $mem->get('myword');if(!$value){ echo "讀取失敗!";}else{ echo "讀取的值=".$value;}
c.刪除、更新例子:
<?phpheader("Content-type:text/html;charset=utf-8");//建立Memcache對象$mem = new Memcache(); //串連Memcache伺服器if(!$mem->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(); ?>
註:mem對象下還有許多方法,可以通過翻閱手冊瞭解。
<7>多個memcached伺服器設定,其實就比一個memcached伺服器改變一點點,就是把多個memcached的伺服器通過方法addserver添加到串連池中,這樣設定完後,crud操作時,內部就會通過相應演算法均衡串連相應伺服器並執行相應操作中。
<?phpheader("Content-type:text/html;charset=utf-8");//建立Memcache對象$mem = new Memcache(); //添加多台memcached伺服器$mem->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"