真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

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

最近公司許多團(tuán)隊(duì)進(jìn)行升級(jí)php7,目前支持php7讀取mc的擴(kuò)展只有memcached。

創(chuàng)新互聯(lián)成都網(wǎng)站建設(shè)按需開(kāi)發(fā)網(wǎng)站,是成都網(wǎng)站推廣公司,為成都發(fā)電機(jī)回收提供網(wǎng)站建設(shè)服務(wù),有成熟的網(wǎng)站定制合作流程,提供網(wǎng)站定制設(shè)計(jì)服務(wù):原型圖制作、網(wǎng)站創(chuàng)意設(shè)計(jì)、前端HTML5制作、后臺(tái)程序開(kāi)發(fā)等。成都網(wǎng)站建設(shè)熱線(xiàn):028-86922220

但是公司許多項(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)證memcache擴(kuò)展和memcached擴(kuò)展讀寫(xiě)數(shù)組數(shù)據(jù)是否不相兼容

測(cè)試腳本:

addServer('10.199.189.129', 10002);$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  ============\n";$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 msession.vip.vip.co.
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ò)展的源碼查找原因。

閱讀源碼

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)行

$mc = new memcache;$mc->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)行

$mc = new memcached;$mc->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)示,而導(dǎo)致其中數(shù)組的標(biāo)識(shí)與memcache定義的數(shù)組標(biāo)識(shí)不一致導(dǎo)致。 經(jīng)過(guò)這次探究,也讓我認(rèn)識(shí)到許多memcached比memcache更優(yōu)秀的地方,相信隨著php7的普及,memcache會(huì)加速地被歷史所淘汰。

  • 作者: Akay 探究php的memcache和memcached擴(kuò)展讀寫(xiě)數(shù)組數(shù)據(jù)不相兼容原因

  • 本文地址: http://www.akayzhang.com/article/6

  • 轉(zhuǎn)載請(qǐng)注明出處


當(dāng)前名稱(chēng):探究php的memcache和memcached擴(kuò)展讀寫(xiě)數(shù)組數(shù)據(jù)不相兼容原因
文章來(lái)源:http://weahome.cn/article/pdchie.html

其他資訊

在線(xiàn)咨詢(xún)

微信咨詢(xún)

電話(huà)咨詢(xún)

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部