探究php的memcache和memcached擴充讀寫數組資料不相相容原因

來源:互聯網
上載者:User

標籤:php   擴充   memcache   

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

但是公司許多項目都會共用一個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));

執行結果:

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

執行結果:

  ~ 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 11511Trying 10.199.189.129...Connected to msession.vip.vip.co.Escape character is ‘^]‘.get testArray1VALUE testArray1 1 30a:3:{i:0;i:1;i:1;i:2;i:2;i:3;}ENDget testArray2VALUE testArray2 4 30a:3:{i:0;i:1;i:1;i:2;i:2;i:3;}END

從結果來看,我們可以發現,memcache和memcached寫到mc裡面的結果是一樣的,也就是說我們的猜測是錯誤的。兩個值的序列化處理一模一樣,區別在於值的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

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

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

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

執行結果是:

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‘));

執行結果是:

int(1)
結論

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

  • 作者: Akay 650) this.width=650;" src="https://akayzhang.com/images/ico-sina.png" style="border:0px;" alt="ico-sina.png" />

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

  • 轉載請註明出處


本文出自 “12484918” 部落格,請務必保留此出處http://12494918.blog.51cto.com/12484918/1889371

探究php的memcache和memcached擴充讀寫數組資料不相相容原因

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.