rpc框架yar之源碼解析- 打包(json, msgpack, serialize)
阿新 • • 發佈:2018-08-13
tor self unpack yar unp 函數 error const 文件 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)