有个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);写入"; 结束
}