分享web开发知识

注册/登录|最近发布|今日推荐

主页 IT知识网页技术软件开发前端开发代码编程运营维护技术分享教程案例
当前位置:首页 > 网页技术

rpc框架yar之源码解析- 打包(json, msgpack, serialize)

发布时间:2023-09-06 02:09责任编辑:傅花花关键词:jsjson
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)

原文地址:http://blog.51cto.com/9681602/2159329

知识推荐

我的编程学习网——分享web前端后端开发技术知识。 垃圾信息处理邮箱 tousu563@163.com 网站地图
icp备案号 闽ICP备2023006418号-8 不良信息举报平台 互联网安全管理备案 Copyright 2023 www.wodecom.cn All Rights Reserved