1. 程式人生 > >rpc框架yar之源碼解析- 打包(json, msgpack, serialize)

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

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)