memcache扩展0.2版本和0.4版本差异(二)

来源:互联网 发布:手机淘宝打折 编辑:程序博客网 时间:2024/06/03 09:39

看看get_version的代码

PHP_FUNCTION(memcache_get_version)
{
    mmc_t *mmc;
    int inx;
    char *version;
    zval *mmc_object = getThis();
    
    if (mmc_object == NULL) {
        if (zend_get_parameters(ht, 1, &mmc_object) == FAILURE) {
            WRONG_PARAM_COUNT;
        }
    }

 注:注意这里多了一个参数,也就是如果当前不是对象调用,传递对象地址也能取到版本信息

    if ((inx = mmc_get_connection(mmc_object, &mmc TSRMLS_CC)) == 0) {
        RETURN_FALSE;
    }

    if ( (version = mmc_get_version(mmc TSRMLS_CC)) ) {
        RETURN_STRING(version, 0);
    }
    RETURN_FALSE;
}


add ,set, replace三个方法依然走的同一个代码-php_mmc_store,不过php_mmc_store方法比0.2版本多了一个参数,命令的长度,虽然本人觉得这个参数根本不需要,方法应内聚,这个参数完全可以在本方法里用strlen取出来,继续

先补充个宏:#define INTERNAL_FUNCTION_PARAMETERS int ht, zval *return_value, zval **return_value_ptr, zval *this_ptr, int return_value_used TSRMLS_DC

static void php_mmc_store (INTERNAL_FUNCTION_PARAMETERS, char *command, int command_len)
{
    mmc_t *mmc;
    int inx, data_len = 0, real_expire = 0, real_flags = 0, key_len;
    char *data = NULL, *real_key;
    int ac = ZEND_NUM_ARGS();
    zval *key, *var, *flags, *expire, *mmc_object = getThis();

    php_serialize_data_t var_hash;
    smart_str buf = {0};

    if (mmc_object == NULL) {

      注:非对象调用,在0.2版本里是不允许非对象调用的,现在允许了
        if (ac < 3 || ac > 5 || zend_get_parameters(ht, ac, &mmc_object, &key, &var, &flags, &expire) == FAILURE) {
            WRONG_PARAM_COUNT;
        }
  注:参数个数3-5个,也就是:对象在内存中地址,key,value,flags,过期时间
        if (ac == 4) {
            convert_to_long(flags);
            real_flags = Z_LVAL_P(flags);
        }
       注:传了flags,将其转为整形
        if (ac == 5) {
            convert_to_long(expire);
            real_expire = Z_LVAL_P(expire);
        }

  注:转换过期时间为整形

    }
    else {
        if (ac < 2 || ac > 4 || zend_get_parameters(ht, ac, &key, &var, &flags, &expire) == FAILURE) {
            WRONG_PARAM_COUNT;
        }
  注:允许参数个数2-4个,对象调用,不需要传对象地址,只传key,value,flags,过期时间
        if (ac == 3) {
            convert_to_long(flags);
            real_flags = Z_LVAL_P(flags);
        }
  注:同上,相同功能的冗余代码如此之多…………
        if (ac == 4) {
            convert_to_long(expire);
            real_expire = Z_LVAL_P(expire);
        }

  注:不说啥了………………
    }

    if ((inx = mmc_get_connection(mmc_object, &mmc TSRMLS_CC)) == 0) {
        RETURN_FALSE;
    }
 注:根据对象内存地址取对象,取不到,false
    convert_to_string(key);

    if (Z_STRLEN_P(key) > MMC_KEY_MAX_SIZE) {
        real_key = estrndup(Z_STRVAL_P(key), MMC_KEY_MAX_SIZE);
        key_len = MMC_KEY_MAX_SIZE;
    }

   注:key的长度限制依然是250
    else {
        real_key = estrdup(Z_STRVAL_P(key));
        key_len = Z_STRLEN_P(key);

    注:尽量用宏,不要用原生的C,切记………
    }
    
    switch (Z_TYPE_P(var)) {
        case IS_STRING:
        case IS_LONG:
        case IS_DOUBLE:
        case IS_BOOL:
            convert_to_string(var);
            if (real_flags & MMC_COMPRESSED) {
                if (!mmc_compress(&data, &data_len, Z_STRVAL_P(var), Z_STRLEN_P(var) TSRMLS_CC)) {
                    RETURN_FALSE;
                }
            }
            else {
                data = Z_STRVAL_P(var);
                data_len = Z_STRLEN_P(var);
            }
            break;
        default:
            PHP_VAR_SERIALIZE_INIT(var_hash);
            php_var_serialize(&buf, &var, &var_hash TSRMLS_CC);
            PHP_VAR_SERIALIZE_DESTROY(var_hash);
            
            if (!buf.c) {
                /* you're trying to save null or smthing went really wrong */
                RETURN_FALSE;
            }
            
            real_flags |= MMC_SERIALIZED;

            data = buf.c;
            data_len = buf.len;
            break;
    }
 注:上面是准备数据,上一版本介绍过 
    if (mmc_exec_storage_cmd(mmc, command, command_len, real_key, key_len, real_flags, real_expire, data, data_len TSRMLS_CC) > 0) {
        if (real_flags & MMC_SERIALIZED) {
            smart_str_free(&buf);
        }
        efree(real_key);
        RETURN_TRUE;
    }

 注:存储操作
    if (real_flags & MMC_SERIALIZED) {
        smart_str_free(&buf);
    }
    efree(real_key);

 注:释放内存,切记
    RETURN_FALSE;
}

原创粉丝点击