php写memcached ,c读取乱码问题[转]

用php寫memcached,用c從memcached讀數據的時候會出現取回的value為亂碼的現象,在百度上查看到的有用php寫,用java讀出亂碼的情況,看到一篇講解說是

    (原文)實現的過程中遇到一個困難:從memcached里取出來的value有時候是亂碼。經過大量的試驗,我發現了一個規律:頁面大小不超過64k的,取出來的值不存在亂碼問題。一旦超過這個值,就變成了亂碼。看來64k是個很敏感的大小。但是memcached的存放單個值的大小最大值是1M。64kb還小的很啊。於是,我試試直接用memcached的服務端命令把600kb的value存入到memcached里,結果是成功了。說明問題是在客戶端了。

    (原文)我查了一下memcached的客戶端(memcached client for java),其中有個方法setCompressEnable(boolean compressEnable),意思是超過多少大小(通過這個setCompressThreshold(long compressThreshold)方法設置大小)就進行壓縮。於是我設置了一下mcc.setCompressEnable(false);再次試驗,成功!!哈哈。。

     看完上面文章後我也嘗試了一下,確實php中set的value在一定位元組數之內是不會有亂碼的,我就在程序中將壓縮取消,結果真的不亂碼了。

 

用php寫數據到memcached的代碼如下:

       $servers = array(
            array('ip1, 11211, 1),
             array('ip2', 11222, 1),
       );
       $mc = NULL;

       function initMemd()
       {
               global $mc;
               global $servers;
               if(count($servers) == 0) return false;

               $mc = new Memcached();
               if(false === $mc->addServers($servers))
               {
                       print_r("add mem servers error!");
                       return false;
               }
               $ret = $mc->setOption(Memcached::OPT_COMPRESSION, false);
               if($ret === false)
               {
                       print_r("set memcached compression option false error!");
                       return false;
               }
               return true;

         }

 

         function pushToMemd($items)
         {
               global $mc;
               $mc->setMulti($items);
               if ($mc->getResultCode() == Memcached::RES_NOTSTORED) {
                       print_r("set memcached error");
               }
          }

用c讀的程序如下:

#include "stdio.h"
#include "stdlib.h"
#include "string.h"
#include "libmemcached/memcached.h"
//gcc 1.c -I/usr/local/libmemcached/include -L /usr/local/libmemcached/lib/ -L /usr/local/lib -lmemcached
int main(int argc, char *argv[])
{
       memcached_st *memc;
       memcached_return rc;
       memcached_server_st *servers;

       
       //connect multi server
       memc = memcached_create(NULL);
      servers = memcached_server_list_append(NULL, "ip1", 11211, &rc);
       //servers = memcached_server_list_append(servers, "ip2", 11211, &rc);

       rc = memcached_server_push(memc, servers);
       memcached_server_free(servers);
       

      //Save multi data
       size_t i;
       char *keys[]= {"key1", "key2", "key3"};
       size_t key_length[]= {4, 4, 4};
      char *values[] = {"value1", "value2", "value3"};
       size_t val_length[]= {6, 6, 6};
       for (i=0; i <1; i++)
       {
               rc = memcached_set(memc, keys[i], key_length[i], values[i], val_length[i], (time_t)180, (uint32_t)0);
               if (rc == MEMCACHED_SUCCESS)
               {
                       printf("Save key:%s data:%s success\n",keys[i], values[i]);
               }
       }

       char return_key[10000];

        size_t return_key_length;
       char *return_value;
       size_t return_value_length;
       uint32_t flags;
       rc = memcached_mget(memc, keys, key_length, 1);
       while ((return_value = memcached_fetch(memc, return_key,&return_key_length, &return_value_length, &flags, &rc))) {
               if (rc == MEMCACHED_SUCCESS)
               {
                       printf("Fetch key:%s data:%s , len=%d\n", return_key, return_value, return_value_length);
               }
       }
 

      //Delete multi data
      for (i=0; i<3; i++)
       {
               rc = memcached_set(memc, keys[i], key_length[i], values[i], val_length[i], (time_t)180, (uint32_t)0);
               rc = memcached_delete(memc, keys[i], key_length[i], (time_t)0);
               if (rc == MEMCACHED_SUCCESS)
               {
                       printf("Delete %s successn", keys[i], values[i]);
               }
       }
       //free
       memcached_free(memc);
       return 0;

}

原文地址:https://www.cnblogs.com/rooney/p/2573145.html