pecl的memcache擴(kuò)展(注意,不是memcache的擴(kuò)展,兩者不同)中連接memcache服務(wù)器有兩種方式:
1.短連接(Memcache::connect)
使用方法 Memcache::connect() 打開的連接在腳本執(zhí)行結(jié)束后會(huì)自動(dòng)關(guān)閉。當(dāng)然,你也可以使用方法 Memcache::close() 來主動(dòng)關(guān)閉?
2.長連接(Memcache::connect)
這個(gè)連接不會(huì)在腳本執(zhí)行結(jié)束后或者 Memcache::close() 被調(diào)用后關(guān)閉,持久化連接僅僅會(huì)在web服務(wù)器關(guān)機(jī)/重啟時(shí)關(guān)閉?。
?
memcache的分布式是通過?Memcache::addServer這個(gè)方法實(shí)現(xiàn)的,下面在windows下測試memcache的分布式實(shí)現(xiàn)
1.在命令行啟動(dòng)兩個(gè)memcache服務(wù)器,分別監(jiān)聽11211和11212端口:
memcached . exe?-p? 11212 ? start ?
?
?2.將以下php代碼保存到localhost/index.php,用瀏覽器瀏覽一次index.php
? <? php
????{
???????? $arr = array (??
???????????? array ( " host " => " 127.0.0.1 " , " port " => 11211 , " weight " => 20 ) , // 127.0.0.1:11211的權(quán)重是20%
???????????? array ( " host " => " 127.0.0.1 " , " port " => 11212 , " weight " => 80 ) ,? // 127.0.0.1:11212的權(quán)重是80%
????????);
???????? $cache = new ?memcache;
???????? foreach ?( $arr ? as ? $ele ?)
????????{
? ? //使用長連接,并且設(shè)置不同memcache服務(wù)器的權(quán)重,將memcache服務(wù)器添加到連接池
???????????? $cache -> addServer( $ele [ " host " ] , $ele [ " port " ] , true , $ele [ " weight " ] );????????????
????????}
???????? return ? $cache ;
????}
? ? $cache ? = ?createCache?();
? ? for ( $i = 0 ; $i < 10 ; $i ++ )
? ? {
//由于使用了分布式,所以這里不需要使用connect或者pconnect打開鏈接,set方法會(huì)調(diào)用memcache的分布式緩存分配算法,按照權(quán)重將緩存項(xiàng)緩存到連接池的某個(gè)服務(wù)器
? ? ? ?? if ( $cache -> set( $i , $i , 0 , 3600 ))
? ? ? ? {
? ? ? ? ? ?? echo ? " 緩存成功,key: $i ,value: $i " ;
? ? ? ? } else ?
? ? ? ? {
? ? ? ? ? ?? echo ? " 緩存失敗 " ;
? ? ? ? }
? ? ? ?? echo ? " <br/> " ;
? ? }
?>
?
3.再開啟兩個(gè)cmd窗口,分別輸入如下內(nèi)容:
telnet? 127.0 . 0.1 ? 11211 ? //先登入memcache服務(wù)器
stats??//查看服務(wù)器當(dāng)前狀態(tài)
結(jié)果如下圖所示:
?
?
//第二個(gè)窗口
telnet?
127.0
.
0.1
?
11212 ? //先登入memcache服務(wù)器
stats??//查看服務(wù)器當(dāng)前狀態(tài)
結(jié)果如下圖所示:
根據(jù)上面的測試情況,發(fā)現(xiàn)
1.兩個(gè)memcache服務(wù)器當(dāng)前連接數(shù)(curr_connections)都是2,這是因?yàn)?
$cache
->
addServer(
$ele
[
"
host
"
]
,
$ele
[
"
port
"
]
,
true
,
$ele
[
"
weight
"
]
) ?第三個(gè)參數(shù)指定使用長連接,所以每個(gè)memcache服務(wù)器保存了兩個(gè)連接:一個(gè)是php里的長連接,一個(gè)是telnet登陸的連接(如果不信,我們多刷新幾次
index
.php這個(gè)頁面,再調(diào)用stats命令,發(fā)現(xiàn)兩臺(tái)memcache服務(wù)器的
curr_connections還是2
)
2.127.0.0.1:11211的current_items為4,
127.0.0.1:11212的current_items為6,這說明十個(gè)緩存項(xiàng)有4個(gè)存到了第一臺(tái)服務(wù)器,有6個(gè)存到了第二胎服務(wù)器,雖然與20%和80%的權(quán)重不符,但是相信緩存項(xiàng)越多,越趨近這個(gè)權(quán)重。
?
?
?
在多做幾次實(shí)驗(yàn)還會(huì)發(fā)現(xiàn):?
?(1).將127.0.0.1:11211和
127.0.0.1:11212兩臺(tái)memcache服務(wù)器都關(guān)掉,再打開127.0.0.1:11211,然后訪問index.php,頁面輸出如下內(nèi)容:
?
?在命令行 telnet 127.0.0.1 11211 再stats,得到如下結(jié)果:
?
通過上面的結(jié)果我們得出結(jié)論, 當(dāng)一個(gè)memcache連接池的某個(gè)服務(wù)器down掉以后,通過memcache分布式緩存分配算法分配到down掉的服務(wù)器的緩存不會(huì)被丟棄,而是會(huì)存儲(chǔ)到另外的服務(wù)器上。
再編寫一個(gè)存儲(chǔ)到localhost/get.php的get.php ,內(nèi)容如下:
? <? php
???? $arr ? = ? array ?( array ?( " host " ? => ? " 127.0.0.1 " , ? " port " ? => ? 11211 , ? " weight " ? => ? 20 ?) , ? array ?( " host " ? => ? " 127.0.0.1 " , ? " port " ? => ? 11212 , ? " weight " ? => ? 80 ?)?);
???? $cache ? = ? new ?memcache?();
???? foreach ?(? $arr ? as ? $ele ?)?{
???????? $cache -> addServer?(? $ele ?[ " host " ] , ? $ele ?[ " port " ] , ? true , ? $ele ?[ " weight " ] , ? 1 ?);
????}
???? return ? $cache ;
}
$cache ? = ?createCache?();
$val ;
for ( $i ? = ? 0 ;? $i ? < ? 10 ;? $i ? ++ )?{
???? $val ? = ? $cache -> get?(? $i ?);
???? if ?( false ? === ? $val )?{
???????? echo ? " 緩存獲取失敗 " ;
????}? else ?{
???????? echo ? " 緩存獲取成功:,key: $val ,value: $val " ;
????}
???? echo ? " <br/> " ;
}
$cache -> close?();
?>
?訪問localhost/get.php,內(nèi)容輸出如下:
? 我們發(fā)現(xiàn)php程序嘗試去連接127.0.0.1:11212發(fā)現(xiàn)其不在線后又去127.0.0.1:11211找到了對(duì)應(yīng)的緩存項(xiàng),這和設(shè)置緩存時(shí)
分布式緩存分配算法
的表現(xiàn)是一致的
? 奇怪的是接著打開127.0.0.1:11212這個(gè)memcache服務(wù)器后再訪問localhost/get.php,輸出內(nèi)容如下:
為什么明明緩存在127.0.0.1:11211都存在,卻有6個(gè)緩存項(xiàng)顯示找不到緩存呢?我覺得是這樣的:當(dāng)通過$cache->get獲取緩存的時(shí)候,分布式緩存分配算法
推算出6個(gè)緩存項(xiàng)是存儲(chǔ)在127.0.0.1:11212這個(gè)memcache服務(wù)器上的,接著發(fā)現(xiàn)127.0.0.1:11212這個(gè)memcache服務(wù)器是在線的,所以即使沒有找到對(duì)應(yīng)的緩存也不會(huì)像上一步一樣去
127.0.0.1:11211尋找緩存
(2)假設(shè)127.0.0.1:11211和127.0.0.1:11212都已經(jīng)開啟 當(dāng)我們將
? $cache
->
addServer(
$ele
[
"
host
"
]
,
$ele
[
"
port
"
]
,
true
,
$ele
[
"
weight
"
]
);
????
改為??
后
發(fā) 現(xiàn)無論刷新多少次localhost/index.php和localhost/get.php,stats 127.0.0.1:11211和127.0.0.1:11212會(huì)看到curr_connections總為1,這是因?yàn)槭褂枚踢B接后每一次頁面腳本執(zhí) 行完畢都會(huì)關(guān)掉連接,所以兩個(gè)memcache服務(wù)器都只有telnet一個(gè)連接在線。
?
(3) 加入set和get的memcache服務(wù)器連接池的連接一樣但是順序不一樣,會(huì)發(fā)現(xiàn)get緩存的時(shí)候明明set的所有緩存項(xiàng)都存入了對(duì)應(yīng)的memcache服務(wù)器但是很多緩存項(xiàng)就是取不到,既set的時(shí)候使用如下連接池:
???????????? array ( " host " => " 127.0.0.1 " , " port " => 11211 , " weight " => 20 ) , // 127.0.0.1:11211的權(quán)重是20%
???????????? array ( " host " => " 127.0.0.1 " , " port " => 11212 , " weight " => 80 ) ,? // 127.0.0.1:11212的權(quán)重是80%
????????);
get的時(shí)候使用如下連接池:
?????????? array ( " host " => " 127.0.0.1 " , " port " => 11211 , " weight " => 20 ) // 127.0.0.1:11211的權(quán)重是20% ??????????
?
?
更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號(hào)聯(lián)系: 360901061
您的支持是博主寫作最大的動(dòng)力,如果您喜歡我的文章,感覺我的文章對(duì)您有幫助,請(qǐng)用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長非常感激您!手機(jī)微信長按不能支付解決辦法:請(qǐng)將微信支付二維碼保存到相冊(cè),切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對(duì)您有幫助就好】元
