成人午夜视频全免费观看高清-秋霞福利视频一区二区三区-国产精品久久久久电影小说-亚洲不卡区三一区三区一区

探究php的memcache和memcached擴展讀寫數組數據不相兼容原因

最近公司許多團隊進行升級php7,目前支持php7讀取mc的擴展只有memcached。

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

但是公司許多項目都會共用一個mc集群來存取用戶session數據,存的時候是登陸時用memcache擴展以array的形式寫進去,讀的時候自然是用memcache擴展以array的形式讀出來。 但是現在只能使用memcached進行讀取。但是據我所知兩者讀取array形式的數據是互不兼容的,因此想探究一下究竟是為什么。

驗證memcache擴展和memcached擴展讀寫數組數據是否不相兼容

測試腳本:

<?phpecho "========== test  string  ============\n";$mc = new memcache;$mc->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í)行結果:

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

從結果來看,印證了我們之前的說法。

猜測原因

由于string沒有問題,出問題是在array格式里面。所以懷疑是array存進mc時的序列化方法不同。于是乎進行進一步的測試:

編寫測試腳本

<?phpecho "========== test  array  ============\n";$mc = new memcache;$mc->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í)行結果:

  ~ 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)
}

接下來直接連接mc進行查看

  ~ 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

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

閱讀源碼

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

經閱讀源碼,發(fā)現memcache將array的數組格式的flag定義為1,而memcached為了將php存進mc中的值進行詳細的類型區(qū)分,將數據類型定義了string,long,double等等的數據類型。

也就是說,當你使用memcache的時候,運行

$mc = new memcache;$mc->addServer('10.199.189.129', 11511);$mc->set('123',1);var_dump($mc->get('123'));

執(zhí)行結果是:

string(1) "1"

你明明存了一個值為數字1的key,但是讀取的時候卻為字符串。 而當你使用memcached的時候,運行

$mc = new memcached;$mc->addServer('10.199.189.129', 11511);$mc->set('123',1);var_dump($mc->get('123'));

執(zhí)行結果是:

int(1)

結論

memcache擴展和memcached擴展讀寫數組數據不相兼容的原因是,memcached為了詳細地區(qū)分數據類型,定義了各種數據類型的標示,而導致其中數組的標識與memcache定義的數組標識不一致導致。 經過這次探究,也讓我認識到許多memcached比memcache更優(yōu)秀的地方,相信隨著php7的普及,memcache會加速地被歷史所淘汰。

  • 作者: Akay 探究php的memcache和memcached擴展讀寫數組數據不相兼容原因

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

  • 轉載請注明出處

網頁名稱:探究php的memcache和memcached擴展讀寫數組數據不相兼容原因
本文網址:http://jinyejixie.com/article4/pdchie.html

成都網站建設公司_創(chuàng)新互聯,為您提供響應式網站、微信小程序品牌網站建設、外貿建站、商城網站網站制作

廣告

聲明:本網站發(fā)布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源: 創(chuàng)新互聯

成都做網站
金门县| 香格里拉县| 宁南县| 克山县| 田阳县| 霞浦县| 仁布县| 安塞县| 方山县| 自贡市| 岐山县| 甘德县| 汾阳市| 浏阳市| 县级市| 荥经县| 中山市| 柳州市| 青州市| 常州市| 图木舒克市| 东丰县| 汉沽区| 旺苍县| 延庆县| 隆昌县| 朝阳区| 万盛区| 房产| 平江县| 兴安盟| 慈利县| 新巴尔虎左旗| 乐都县| 南平市| 灵山县| 易门县| 高雄县| 阳曲县| 阳原县| 莎车县|