memcache扩展(0.2版本)源代码讲解(memcache_increment)

increment和decrement走的同一个方法 php_mmc_incr_decr

PHP_FUNCTION(memcache_increment)

{
    php_mmc_incr_decr(INTERNAL_FUNCTION_PARAM_PASSTHRU, 1);

}

PHP_FUNCTION(memcache_decrement)
{
    php_mmc_incr_decr(INTERNAL_FUNCTION_PARAM_PASSTHRU, 0);
}

我们来看 php_mmc_incr_decr的方法 为0或1

static void php_mmc_incr_decr(INTERNAL_FUNCTION_PARAMETERS, int cmd)
{
    zval *id, **value, **key;
    mmc_t *mmc;
    int inx, result, real_value = 1;
    int ac = ZEND_NUM_ARGS();
    char *command;

    if ((id = getThis()) != 0) {
        if ((inx = mmc_get_connection(id, &mmc TSRMLS_CC)) == 0) {
            RETURN_FALSE;
        }

        if (ac < 1 || ac > 2 || zend_get_parameters_ex(ac, &key, &value) == FAILURE) {
            WRONG_PARAM_COUNT;
        }
  注:只允许一个参数或者2个参数,key和要增加或减少的value
        convert_to_string_ex(key);
    
        if (ac == 2) {
            convert_to_long_ex(value);
            real_value = Z_LVAL_PP(value);
        }

        if ((result = mmc_incr_decr(mmc, cmd, Z_STRVAL_PP(key), real_value)) < 0) {
            RETURN_FALSE;
        }
        RETURN_LONG(result);
    }

    if (cmd > 0) {
        command = estrdup("increment");
    }
    else {
        command = estrdup("decrement");
    }
    
    php_error_docref(NULL TSRMLS_CC, E_NOTICE, "memcache_%s() should not be called like this. Use $memcache->%s($key,$value) to %s item", command, command, command);
    efree(command);
    RETURN_FALSE;
}

继续看mmc_incr_decr

static int mmc_incr_decr (mmc_t *mmc, int cmd, char *key, int value)
{
    char *command;
    int  cmd_len, response_buf_size;

    command = emalloc(4 + strlen(key) + MAX_LENGTH_OF_LONG + 1);
 注:要传输的命令字符串,分配内存
    PREPARE_KEY(key, strlen(key));
    注:过滤key
    if (cmd > 0) {
        cmd_len = sprintf(command, "incr %s %d", key, value);
    }
    else {
        cmd_len = sprintf(command, "decr %s %d", key, value);
    }
    注:cmd为1是增加 反之减少 command="incr key value" | "decr key value"
    if (mmc_sendcmd(mmc, command, cmd_len) < 0) {
        efree(command);
        return -1;
    }
    efree(command);
  
    if ((response_buf_size = mmc_readline(mmc)) > 0) {
        mmc_debug("mmc_incr_decr: server's answer is: '%s'", mmc->inbuf);
        if (mmc_str_left(mmc->inbuf, "NOT_FOUND", response_buf_size, 9)) {
            return -1;
        }
        else if (mmc_str_left(mmc->inbuf, "ERROR", response_buf_size, 5)) {
            return -1;
        }
        else if (mmc_str_left(mmc->inbuf, "CLIENT_ERROR", response_buf_size, 12)) {
            return -1;
        }
        else if (mmc_str_left(mmc->inbuf, "SERVER_ERROR", response_buf_size, 12)) {
            return -1;
        }

  注:返回-1,说明执行错误
        else {
            return atoi(mmc->inbuf);

           注:走到这说明成功了
        }
    }
    mmc_debug("mmc_incr_decr: failed to read line from server");
    return -1;

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值