c调用memcached

有个c++的游戏项目需要用的memcached
需求是c++写入数据,php读取数据
使用到没什么难的,主要这个游戏有c++和php两部分。php对value是有序列化操作的


libmemcached主页(包括文档)
http://libmemcached.org/libMemcached.html
下载地址
http://launchpad.net/libmemcached/1.0/0.53/+download/libmemcached-0.53.tar.gz

编译需要g++,安装yum install gcc-c++.x86_64

然后 tar -zxvf libmemcached-0.53.tar.gz
./configure && make && make install

编写代码
#include<stdio.h>
#include<libmemcached/memcached.h>

int main (int argc, char ** argv)
{
    memcached_st *memc;
    memcached_return_t rc;

    // connect to server
    const char *config_string= "--SERVER=127.0.0.1:10001";
    memc= memcached(config_string, strlen(config_string));


    char *key = "Right_SNG_Data_Mining";// memcached key or queue key
    char *value = "datamining just as test";// datamining  php execute file
    size_t lenval, rtv;
    uint32_t rtf;
    lenval = strlen(value);

    // save value to memcached
    rc = memcached_set(memc, key, strlen(key), value, lenval, (time_t)0, (uint32_t)0);
    if(rc == MEMCACHED_SUCCESS)
        fprintf(stdout, "save success!\n");
    else
        fprintf(stdout, "save failed!\n");

    memcached_free(memc);

    return 0;
}

gcc main.c -lmemcached

编译执行遇到问题
./a.out: error while loading shared libraries: libmemcached.so.8: cannot open shared object file: No such file or directory

执行locate查看下这个库所在路径
[root@db_81 etc]# locate libmemcached.so.8
/usr/local/lib/libmemcached.so.8
/usr/local/lib/libmemcached.so.8.0.0

把/usr/local/lib加入/etc/ld.so.conf,然后执行ldconfig就可以了

执行./a.out
查看值是写入了,现在解决序列化的问题。

php的serialize函数在ext\standard\basic_functions.c中

PHP_FE(serialize,arginfo_serialize)

static
ZEND_BEGIN_ARG_INFO(arginfo_serialize, 0)
 ZEND_ARG_INFO(0, var)
ZEND_END_ARG_INFO()

最终实现是在ext\standard\var.c
PHP_FUNCTION(serialize)
然后最终是调用
static void php_var_serialize_intern(smart_str *buf, zval *struc, HashTable *var_hash TSRMLS_DC)
参考这个函数,写个c的就行了
我们的需求就是一个简单的key value数组,值类型为整数和字符串
case IS_ARRAY
smart_str_appendl(buf, "a:", 2)
smart_str_append_long(buf, i);
smart_str_appendl(buf, ":{", 2);
意思就是如果类型是数组,则写入 a:数组元素数量:{ 结束后写入}
然后处理key,如果是字符串调用php_var_serialize_string
然后处理值,递归调用php_var_serialize_intern来处理


static inline void php_var_serialize_long(smart_str *buf, long val)
{
 smart_str_appendl(buf, "i:", 2); 写入i:
 smart_str_append_long(buf, val);写入值
 smart_str_appendc(buf, ';');写入;结束
}

static inline void php_var_serialize_string(smart_str *buf, char *str, int len)
{
 smart_str_appendl(buf, "s:", 2);写入s:
 smart_str_append_long(buf, len);写入长度
 smart_str_appendl(buf, ":\"", 2);写入:"
 smart_str_appendl(buf, str, len);写入字符串本身
 smart_str_appendl(buf, "\";", 2);写入"; 结束
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值