程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 網頁編程 >> PHP編程 >> 關於PHP編程 >> windows配置memcache的方法

windows配置memcache的方法

編輯:關於PHP編程

之前我曾經寫過一篇名為《PHP 實現多服務器共享 SESSION 數據》文章,文中的 SESSION 是使用數據庫教程保存的,在並發訪問量大的時候,服務器的負載會很大,經常會超出 MySQL 最大連接數,利用 memcached,我們可以很好地解決這個問題,工作原理如下:

用戶訪問網頁時,查看 memcached 中是否有當前用戶的 SESSION 數據,使用 session_id() 作為唯一標識符;如果數據存在,則直接返回,如果不存在,再進行數據庫連接,獲取 SESSION 數據,並將此數據保存到 memcached 中,供下次使用;
當前的 PHP 運行結束(或使用了 session_write_close())時,會調用 My_Sess::write() 方法,將數據寫入數據庫,這樣的話,每次仍然會有數據庫操作,對於這個方法,也需要進行優化。使用一個全局變量,記錄用戶進入頁面時的 SESSION 數據,然後在 write() 方法內比較此數據與想要寫入的 SESSION 數據是否相同,不同才進行數據庫連接、寫入數據庫,同時將 memcached 中對應的對象刪除,如果相同的話,則表示 SESSION 數據未改變,那麼就可以不做任何操作,直接返回了;
那麼用戶 SESSION 過期時間怎麼解決呢?記得 memcached 的 add() 方法有個過期時間參數 $exp 嗎?把這個參數值設置成小於 SESSION 最大存活時間即可。另外別忘了給那些一直在線的用戶延續 SESSION 時長,這個可以在 write() 方法中解決,通過判斷時間,符合條件則更新數據庫數據。

今天我們就來看看win 下memcached的方法

將memcache服務器安裝包解壓到C:memcached文件夾後,使用cmd命令窗口安裝。

1>開始>運行:CMD(確定)

2>cd C:memcached(回車)

3>memcached -d install(回車 這步執行安裝)

4>memcached -d start(回車 這步執行啟動memcache服務器,默認分配64M內存,使用11211端口)

此時memcache服務器已經可以正常使用了。


在服務端運行:
# ./memcached -d -m 2048 -l 10.0.0.40 -p 11211
這將會啟動一個占用2G內存的進程,並打開11211端口用於接收請求。由於32位系統只能處理4G內存的尋址,所以在大於4G內存使用PAE的32位服務器上可以運行2-3個進程,並在不同端口進行監聽。

又如:memcached -d -m 10 -u root -l 192.168.105.73 -p 12000 -c 256 -P /tmp/memcached.pid

-d選項是啟動一個守護進程,
-m是分配給Memcache使用的內存數量,單位是MB,我這裡是10MB,
-u是運行Memcache的用戶,我這裡是root,
-l是監聽的服務器IP地址,如果有多個地址的話,我這裡指定了服務器的IP地址192.168.105.73 ,
-p是設置Memcache監聽的端口,我這裡設置了12000,最好是1024以上的端口,
-c選項是最大運行的並發連接數,默認是1024,我這裡設置了256,按照你服務器的負載量來設定,
-P是設置保存Memcache的pid文件,我這裡是保存在 /tmp/memcached.pid

memcache服務器安全:

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

現在就關於修改memcache服務器配置的問題說明如下:

1>用內網ip的方式提供web應用服務器調用,不允許直接通過外網調用,如將memcache服務器放在192.168.1.55的服務器上

2>修改端口,如改為11200

3>分配內存,如分配1024M(1G內存)

方法如下:

 

1>開始>運行:CMD(確定)

2>cd C:memcached(回車)

3>memcached -m 1024 -p 11200 -l 192.168.1.55(回車)

注意,此時命令行不會回到C:memcached>狀態,並且實際上memcache服務器悄悄變為stop狀態了。此窗口不可以關閉。新開一個cmd窗口

4>開始>運行:CMD(確定)

5>cd C:memcached(回車)

6>memcached -d start(回車)可以關閉此cmd窗口。

此時可以使用新配置的memcache服務器了。


上述方法雖然解決了修改默認配置的問題,但是始終會有一個cmd窗口不可以關閉,否則就回到11211端口的默認配置。

更好的解決方案是通過修改服務的注冊表配置:

1>開始>運行:regedit(回車)

2>在注冊表中找到:HKEY_LOCAL_MACHINESYSTEMCurrentControlSetServicesmemcached Server

3>默認的ImagePath鍵的值是:"c:memcachedmemcached.exe" -d runservice,改為:"c:memcachedmemcached.exe" -d runservice -m 512 -p 11200 -l 192.168.1.55(確定,關閉注冊表)

4>我的電腦(右鍵)>管理>服務 找到memcache的服務,重新啟動一次即可生效。


此時,同網段內的電腦仍然可以利用這台memcache服務器,我們限定指定的web應用服務器才能夠使用,通過防火牆的方式。如只允許192.168.1.2這台Web服務器對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服務器的訪問,能夠有效的阻止一些非法訪問,相應的也可以增加一些其他的規則來加強安全性,這個可以根據自己的需要來做


很多時候需要監控服務器上的Memcached運行情況,比如緩存的查詢次數,命中率之類的。但找到的
那個memcached-tool是linux下用perl寫的,我也沒試過windows能不能用。後來發現個簡單的辦法可以做到,就是使用Telnet。

1、windows系統連接memcached端口 cmd命令行中鍵入telnet 192.168.1.1 11211 11211是memcached綁定的端口號。
2、連接上端口後輸入 stats命令,即可得到描述Memcached服務器運行情況的參數。
STAT pid 4356 服務器進程ID
STAT uptime 56625 服務器運行時間,單位秒
STAT time 1225249079 服務器當前的UNIX時間
STAT version 1.1.0 服務器的版本號
STAT pointer_size 64
STAT rusage_user 151.845489 該進程累計的用戶時間(秒:微妙)
STAT rusage_system 121.667603 該進程累計的系統時間(秒:微妙)
STAT ibuffer_size 4096
STAT curr_connections 13 連接數量
STAT total_connections 54136 服務器運行以來接受的連接總數
STAT connection_structures 318 服務器分配的連接結構的數量
STAT cmd_get 100595 取回請求總數
STAT cmd_set 6510 存儲請求總數
STAT get_hits 96543 請求成功的總次數
STAT get_misses 4052 請求失敗的總次數
STAT bytes_read 4427679 服務器從網絡讀取到的總字節數
STAT bytes_written 6585596 服務器向網絡發送的總字節數

1>、uptime 是memcached運行的秒數,
2>、cmd_get是查詢緩存的次數。
3>、這兩個數據相除一下就能得到平均每秒請求緩存的次數——最近niupu的流量很低,所以平均也就一秒請求一次多,
這麼點大的壓力,用文件系統緩存一樣沒問題,根本不會體現出使用memcached的優越。
4>、下面的cmd_set 就是設置key=>value的次數。整個memcached是個大hash,用cmd_get沒有找到的內
容,就會調用一下cmd_set寫進緩存裡。
5>、緊跟著是get_hits,就是緩存命中的次數。緩存命中率 = get_hits/cmd_get * 100%。
6>、下面的get_misses的數字加上get_hits應該等於cmd_get。
7>、而total_itemscurr_items表示現在在緩存中的鍵值對個數.
8>、在圖上total_items == cmd_set == get_misses,不過當可用最大內存用光時,memcached就會刪掉一些內容,上面的等式就不成立了

好了,下面來段測試代碼

<?php教程
//   包含 memcached 類文件
require_once(‘memcached-client.php’);
//   選項設置
$options = array(
    ’servers’ => array(‘192.168.1.1:11211′), //memcached 服務的地址、端口,可用多個數組元素表示多個 memcached 服務
    ‘debug’ => true,  //是否打開 debug
    ‘compress_threshold’ => 10240,  //超過多少字節的數據時進行壓縮
    ‘persistant’ => false  //是否使用持久連接
    );
//   創建 memcached 對象實例
$mc = new memcached($options);
//   設置此腳本使用的唯一標識符
$key = ‘mykey’;
//   往 memcached 中寫入對象
$mc->add($key, ’some random strings’);
$val = $mc->get($key);
echo “n”.str_pad(‘$mc->add() ’, 60, ‘_’).“n”;
var_dump($val);
//   替換已寫入的對象數據值
$mc->replace($key, array(’some’=>‘haha’, ‘array’=>‘xxx’));
$val = $mc->get($key);
echo “n”.str_pad(‘$mc->replace() ’, 60, ‘_’).“n”;
var_dump($val);
//   刪除 memcached 中的對象
$mc->delete($key);
$val = $mc->get($key);
echo “n”.str_pad(‘$mc->delete() ’, 60, ‘_’).“n”;
var_dump($val);
?>


Memcache 方法列表:

Memcache::add — Add an item to the server
Memcache::addServer — Add a memcached server to connection pool
Memcache::close — Close memcached server connection
Memcache::connect — Open memcached server connection
memcache_debug — Turn debug output on/off
Memcache::decrement — Decrement item’s value
Memcache::delete — Delete item from the server
Memcache::flush — Flush all existing items at the server
Memcache::get — Retrieve item from the server
Memcache::getExtendedStats — Get statistics from all servers in pool
Memcache::getServerStatus — Returns server status
Memcache::getStats — Get statistics of the server
Memcache::getVersion — Return version of the server
Memcache::increment — Increment item’s value
Memcache::pconnect — Open memcached server persistent connection
Memcache::replace — Replace value of the existing item
Memcache::set — Store data at the server
Memcache::setCompressThreshold — Enable automatic compression of large values
Memcache::setServerParams — Changes server parameters and status at runtime

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved