成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專(zhuān)欄INFORMATION COLUMN

php的memcache擴(kuò)展和memcached擴(kuò)展讀寫(xiě)數(shù)組不相兼容原因探究

dreamtecher / 2926人閱讀

摘要:背景最近公司許多團(tuán)隊(duì)進(jìn)行升級(jí),目前支持讀取的擴(kuò)展只有。驗(yàn)證驗(yàn)證擴(kuò)展和擴(kuò)展讀寫(xiě)數(shù)組數(shù)據(jù)是否不相兼容測(cè)試腳本執(zhí)行結(jié)果從結(jié)果來(lái)看,印證了我們之前的說(shuō)法。為了保證擴(kuò)展和擴(kuò)展直接寫(xiě)的數(shù)據(jù)可以相互讀取,只能用的格式寫(xiě)入。

背景

最近公司許多團(tuán)隊(duì)進(jìn)行升級(jí)php7,目前支持php7讀取mc的擴(kuò)展只有memcached。
但是公司許多項(xiàng)目都會(huì)共用一個(gè)mc集群來(lái)存取用戶(hù)session數(shù)據(jù),存的時(shí)候是登陸時(shí)用memcache擴(kuò)展以array的形式寫(xiě)進(jìn)去,讀的時(shí)候自然是用memcache擴(kuò)展以array的形式讀出來(lái)。 但是現(xiàn)在只能使用memcached進(jìn)行讀取。但是據(jù)我所知兩者讀取array形式的數(shù)據(jù)是互不兼容的,因此想探究一下究竟是為什么。

驗(yàn)證

驗(yàn)證memcache擴(kuò)展和memcached擴(kuò)展讀寫(xiě)數(shù)組數(shù)據(jù)是否不相兼容
測(cè)試腳本:

addServer("10.199.189.129", 11511); 
$key = "testString"; 
$mc->set($key, "test success"); 
var_dump($mc->get($key)); 
$mc2 = new memcached; 
$mc2->addServer("10.199.189.129", 11511); 
var_dump($mc2->get($key)); 
echo "========== test array ============
"; 
$key2 = "testArray"; 
$mc->set($key2, [1,2,3]); 
var_dump($mc->get($key2)); 
var_dump($mc2->get($key2));

執(zhí)行結(jié)果:

? ~ php /apps/dat/test.php 
========== test string ============ 
string(12) "test success" 
string(12) "test success" 
========== test array ============ 
array(3) { [0]=> int(1) [1]=> int(2) [2]=> int(3) } 
int(0)

從結(jié)果來(lái)看,印證了我們之前的說(shuō)法。

猜測(cè)原因

由于string沒(méi)有問(wèn)題,出問(wèn)題是在array格式里面。所以懷疑是array存進(jìn)mc時(shí)的序列化方法不同。于是乎進(jìn)行進(jìn)一步的測(cè)試:
編寫(xiě)測(cè)試腳本

addServer("10.199.189.129", 11511); 
$mc2 = new memcached; 
$mc2->addServer("10.199.189.129", 11511); 
$key2 = "testArray1"; 
$key3 = "testArray2"; 
$mc->set($key2, [1,2,3]); 
$mc2->set($key3, [1,2,3]); 
var_dump($mc->get($key2)); 
var_dump($mc2->get($key3));

執(zhí)行結(jié)果:

? ~ php /apps/dat/test.php 
========== test array ============ 
array(3) { [0]=> int(1) [1]=> int(2) [2]=> int(3) } 
array(3) { [0]=> int(1) [1]=> int(2) [2]=> int(3) }

接下來(lái)直接連接mc進(jìn)行查看

? ~ telnet 10.199.189.129 11511 
Trying 10.199.189.129... 
Connected to 10.199.189.129
Escape character is "^]". 
get testArray1 
VALUE testArray1 1 30 
a:3:{i:0;i:1;i:1;i:2;i:2;i:3;} 
END 
get testArray2 
VALUE testArray2 4 30 
a:3:{i:0;i:1;i:1;i:2;i:2;i:3;} 
END

從結(jié)果來(lái)看,我們可以發(fā)現(xiàn),memcache和memcached寫(xiě)到mc里面的結(jié)果是一樣的,也就是說(shuō)我們的猜測(cè)是錯(cuò)誤的。兩個(gè)值的序列化處理一模一樣,區(qū)別在于值的flag不同。 memcache存儲(chǔ)array數(shù)據(jù)的時(shí)候,falg為1,而memcached為4. 我們知道,mc中值的flag是提供給使用者自定義,方便再讀取的時(shí)候做不同的處理。但是為什么兩者的flag定義會(huì)不相同呢。 抱著這個(gè)疑問(wèn),試著通過(guò)閱讀兩個(gè)擴(kuò)展的源碼查找原因。

閱讀兩個(gè)擴(kuò)展的源碼 memcache

php_memcache.h:

#define MMC_SERIALIZED 1 
#define MMC_COMPRESSED 2
memcached

php_memcached.c

#define MEMC_VAL_IS_STRING 0 
#define MEMC_VAL_IS_LONG 1 
#define MEMC_VAL_IS_DOUBLE 2 
#define MEMC_VAL_IS_BOOL 3 
#define MEMC_VAL_IS_SERIALIZED 4 
#define MEMC_VAL_IS_IGBINARY 5 
#define MEMC_VAL_IS_JSON 6 
#define MEMC_VAL_IS_MSGPACK 7

經(jīng)閱讀源碼,發(fā)現(xiàn)memcache將array的數(shù)組格式的flag定義為1,而memcached為了將php存進(jìn)mc中的值進(jìn)行詳細(xì)的類(lèi)型區(qū)分,將數(shù)據(jù)類(lèi)型定義了string,long,double等等的數(shù)據(jù)類(lèi)型。
也就是說(shuō),當(dāng)你使用memcache的時(shí)候,運(yùn)行

addServer("10.199.189.129", 11511); 
$mc->set("123",1); 
var_dump($mc->get("123"));

執(zhí)行結(jié)果是:

 string(1) "1"

你明明存了一個(gè)值為數(shù)字1的key,但是讀取的時(shí)候卻為字符串。 而當(dāng)你使用memcached的時(shí)候,運(yùn)行

addServer("10.199.189.129", 11511); 
$mc->set("123",1); 
var_dump($mc->get("123"));

執(zhí)行結(jié)果是:

 int(1)
結(jié)論

memcache擴(kuò)展和memcached擴(kuò)展讀寫(xiě)數(shù)組數(shù)據(jù)不相兼容的原因是,memcached為了詳細(xì)地區(qū)分?jǐn)?shù)據(jù)類(lèi)型,定義了各種數(shù)據(jù)類(lèi)型的標(biāo)識(shí),而其中數(shù)組的標(biāo)識(shí)與memcache定義的數(shù)組標(biāo)識(shí)不一致導(dǎo)致。
為了保證memcache擴(kuò)展和memcached擴(kuò)展直接寫(xiě)的數(shù)據(jù)可以相互讀取,只能用string的格式寫(xiě)入mc。
經(jīng)過(guò)這次探究,也讓我認(rèn)識(shí)到許多memcached比memcache更優(yōu)秀的地方,相信隨著php7的普及,memcache會(huì)加速地被歷史所淘汰。

轉(zhuǎn)載注明來(lái)源:
作者: Akay
本文地址: [http://www.akayzhang.com/arti...

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/61702.html

相關(guān)文章

  • phpmemcache擴(kuò)展memcached擴(kuò)展讀寫(xiě)數(shù)組不相兼容原因探究

    摘要:背景最近公司許多團(tuán)隊(duì)進(jìn)行升級(jí),目前支持讀取的擴(kuò)展只有。驗(yàn)證驗(yàn)證擴(kuò)展和擴(kuò)展讀寫(xiě)數(shù)組數(shù)據(jù)是否不相兼容測(cè)試腳本執(zhí)行結(jié)果從結(jié)果來(lái)看,印證了我們之前的說(shuō)法。為了保證擴(kuò)展和擴(kuò)展直接寫(xiě)的數(shù)據(jù)可以相互讀取,只能用的格式寫(xiě)入。 背景 最近公司許多團(tuán)隊(duì)進(jìn)行升級(jí)php7,目前支持php7讀取mc的擴(kuò)展只有memcached。但是公司許多項(xiàng)目都會(huì)共用一個(gè)mc集群來(lái)存取用戶(hù)session數(shù)據(jù),存的時(shí)候是登陸時(shí)用...

    adam1q84 評(píng)論0 收藏0
  • PHP面試??純?nèi)容之MemcacheRedis(1)

    摘要:以下正文的部分內(nèi)容來(lái)自程序員面試筆試寶典書(shū)籍,如果轉(zhuǎn)載請(qǐng)保留出處一什么是是一個(gè)開(kāi)源免費(fèi)高性能的分布式對(duì)象緩存系統(tǒng),它基于一個(gè)存儲(chǔ)鍵值對(duì)的來(lái)存儲(chǔ)數(shù)據(jù)到內(nèi)存中。預(yù)告面試??純?nèi)容之和將于本周三更新。 你好,是我琉憶。繼上周(2019.2-11至2-15)發(fā)布的PHP面試??純?nèi)容之面向?qū)ο髮?zhuān)題后,發(fā)布的第二個(gè)專(zhuān)題,感謝你的閱讀。本周(2019.2-18至2-22)的文章內(nèi)容點(diǎn)為以下幾點(diǎn),更新時(shí)...

    wenyiweb 評(píng)論0 收藏0
  • PHP面試??純?nèi)容之MemcacheRedis(1)

    摘要:以下正文的部分內(nèi)容來(lái)自程序員面試筆試寶典書(shū)籍,如果轉(zhuǎn)載請(qǐng)保留出處一什么是是一個(gè)開(kāi)源免費(fèi)高性能的分布式對(duì)象緩存系統(tǒng),它基于一個(gè)存儲(chǔ)鍵值對(duì)的來(lái)存儲(chǔ)數(shù)據(jù)到內(nèi)存中。預(yù)告面試常考內(nèi)容之和將于本周三更新。 你好,是我琉憶。繼上周(2019.2-11至2-15)發(fā)布的PHP面試常考內(nèi)容之面向?qū)ο髮?zhuān)題后,發(fā)布的第二個(gè)專(zhuān)題,感謝你的閱讀。本周(2019.2-18至2-22)的文章內(nèi)容點(diǎn)為以下幾點(diǎn),更新時(shí)...

    nanfeiyan 評(píng)論0 收藏0
  • Mac安裝memcached擴(kuò)展支持sasl

    摘要:安裝擴(kuò)展支持在服務(wù)以及擴(kuò)展中,默認(rèn)都是不支持用戶(hù)名和密碼,但是如果需要可以通過(guò)打開(kāi)來(lái)提供用戶(hù)名和密碼服務(wù)。最后在修改對(duì)應(yīng)的文件增加擴(kuò)展重啟,大功告成以上內(nèi)容僅供參考 Mac安裝memcached擴(kuò)展支持sasl Memcached在服務(wù)以及擴(kuò)展中,默認(rèn)都是不支持用戶(hù)名和密碼,但是如果需要可以通過(guò)打開(kāi)sasl來(lái)提供用戶(hù)名和密碼服務(wù)。所以在memcached的擴(kuò)展與服務(wù)器安裝時(shí)都需要啟用s...

    qieangel2013 評(píng)論0 收藏0
  • Mac安裝memcached擴(kuò)展支持sasl

    摘要:安裝擴(kuò)展支持在服務(wù)以及擴(kuò)展中,默認(rèn)都是不支持用戶(hù)名和密碼,但是如果需要可以通過(guò)打開(kāi)來(lái)提供用戶(hù)名和密碼服務(wù)。最后在修改對(duì)應(yīng)的文件增加擴(kuò)展重啟,大功告成以上內(nèi)容僅供參考 Mac安裝memcached擴(kuò)展支持sasl Memcached在服務(wù)以及擴(kuò)展中,默認(rèn)都是不支持用戶(hù)名和密碼,但是如果需要可以通過(guò)打開(kāi)sasl來(lái)提供用戶(hù)名和密碼服務(wù)。所以在memcached的擴(kuò)展與服務(wù)器安裝時(shí)都需要啟用s...

    TANKING 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<