rpc框架yar之源码解析- 打包(json, msgpack, serialize)
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了rpc框架yar之源码解析- 打包(json, msgpack, serialize)相关的知识,希望对你有一定的参考价值。
yar源码解析之打包
yar的数据打包和解包逻辑在packagers文件夹下, 主要有以下三种:
- json.c
- msgpack.c
- php.c
?json.c
主要以json格式对数据进行打包和解包。
// 调用php_json扩展进行处理
int php_yar_packager_json_pack(const yar_packager_t *self, zval *pzval, smart_str *buf, char **msg) /* {{{ */ {
#if ((PHP_MAJOR_VERSION == 5) && (PHP_MINOR_VERSION < 3))
php_json_encode(buf, pzval);
#else
php_json_encode(buf, pzval, 0); /* options */
#endif
return 1;
} /* }}} */
zval * php_yar_packager_json_unpack(const yar_packager_t *self, char *content, size_t len, char **msg, zval *rret) /* {{{ */ {
zval *return_value;
php_json_decode(rret, content, len, 1, 512);
return_value = rret;
return return_value;
} /* }}} */
msgpack.c
依赖于msgpack的扩展,关于msgpack的介绍,大家可以自己百度下。
// 这两行应该是 msgpack扩展包里的函数。
extern void php_msgpack_serialize(smart_str *buf, zval *val);
extern void php_msgpack_unserialize(zval *return_value, char *str, size_t str_len);
int php_yar_packager_msgpack_pack(const yar_packager_t *self, zval *pzval, smart_str *buf, char **msg) /* {{{ */ {
php_msgpack_serialize(buf, pzval);
return 1;
} /* }}} */
zval * php_yar_packager_msgpack_unpack(const yar_packager_t *self, char *content, size_t len, char **msg, zval *rret) /* {{{ */ {
zval *return_value;
ZVAL_NULL(rret);
php_msgpack_unserialize(rret, content, len); // 调用msgpack扩展函数进行
return_value = rret;
return return_value;
} /* }}} */
php.c
下面代码应该是利用php原生的serialize方法进行解析。
int php_yar_packager_php_pack(const yar_packager_t *self, zval *pzval, smart_str *buf, char **msg) /* {{{ */ {
php_serialize_data_t var_hash; // php_serialize_data_t 是在php_var.h中定义HashTable类型的指针
PHP_VAR_SERIALIZE_INIT(var_hash); // 初始化这个HashTable
php_var_serialize(buf, pzval, &var_hash); //
PHP_VAR_SERIALIZE_DESTROY(var_hash); // 销毁掉这个HashTable
return 1;
} /* }}} */
zval * php_yar_packager_php_unpack(const yar_packager_t *self, char *content, size_t len, char **msg, zval *rret) /* {{{ */ {
zval *return_value;
const unsigned char *p;
php_unserialize_data_t var_hash;
p = (const unsigned char*)content;
PHP_VAR_UNSERIALIZE_INIT(var_hash);
if (!php_var_unserialize(rret, &p, p + len, &var_hash)) {
zval_ptr_dtor(rret);
PHP_VAR_UNSERIALIZE_DESTROY(var_hash);
spprintf(msg, 0, "unpack error at offset %ld of %ld bytes", (long)((char*)p - content), len);
return NULL;
}
PHP_VAR_UNSERIALIZE_DESTROY(var_hash);
return_value = rret;
return return_value;
} /* }}} */
以上是关于rpc框架yar之源码解析- 打包(json, msgpack, serialize)的主要内容,如果未能解决你的问题,请参考以下文章
微服务开源框架TARS的RPC源码解析 之 初识TARS C++服务端
1Google Grpc 框架源码解析 之 Hello World