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

本文详细介绍了PHP中Memcache删除数据的方法,包括memcache_delete函数的实现原理与mmc_delete的具体步骤,展示了如何通过PHP操作Memcache来删除指定的缓存项。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

从MC中删除数据的代码如下:

PHP_FUNCTION(memcache_delete)
{
    zval *id, **key, **time;

   注:当前MC对象在内存中的地址,要删除的key,及时间
    mmc_t *mmc;

 注:连接对象
    int inx, result, real_time;

 注:连接id
    int ac = ZEND_NUM_ARGS();
 注:参数个数
    if ((id = getThis()) != 0) {
        if ((inx = mmc_get_connection(id, &mmc TSRMLS_CC)) == 0) {
            RETURN_FALSE;
        }

  注:没建立连接,返回false
        if (ac < 1 || ac > 2 || zend_get_parameters_ex(ac, &key, &time) == FAILURE) {
            WRONG_PARAM_COUNT;
        }
        注:参数个不是一个或两个,返回参数个数错误
        convert_to_string_ex(key);

  注:key转成字符串
        real_time = 0;
        
        if (ac > 1) {
            convert_to_long_ex(time);
            real_time = Z_LVAL_PP(time);
        }
        注:如果传递了time参数,使用传递的time值,否则使用默认0
        result = mmc_delete(mmc, Z_STRVAL_PP(key), real_time);
        注:调用 mmc_delete方法删除数据,mmc_delete参考后续代码
        if (result > 0) {
            RETURN_TRUE;
        }

       注:删除成功
        else if (result == 0) {
            php_error_docref(NULL TSRMLS_CC, E_NOTICE, "such key doesn't exist");
            RETURN_FALSE;
        }

  注:key不存在
        else {
            php_error_docref(NULL TSRMLS_CC, E_NOTICE, "error while deleting item");
        }

  注:删除失败
        RETURN_FALSE;
    }
    php_error_docref(NULL TSRMLS_CC, E_NOTICE, "memcache_delete() should not be called like this. Use $memcache->delete($key,$timeout) to delete item");
    RETURN_FALSE;
}


mmc_delete方法代码如下:

两个参数,一个是要删除的key,一个是时间

static int mmc_delete(mmc_t *mmc, char *key, int time)
{
    char *real_command, *time_tmp;
    int size, response_buf_size;
    
    time_tmp = emalloc(MAX_LENGTH_OF_LONG + 1);

    注:分配内存MAX_LENGTH_OF_LONG宏,32位系统是11  64位系统是20
    size = sprintf(time_tmp, "%d", time);
    time_tmp[size] = '\0';
    注:把time写入time_tmp缓存区,在最后追加一个结束符
    real_command = emalloc(
                              6                /* strlen(delete) */
                            + 1                /* space */
                            + strlen(key)
                            + 1                /* space */
                            + size
                            + 1
                            );
 注:命令字符串的大小,举例 delete key1 time
    PREPARE_KEY(key, strlen(key));

    注:替换宏,走的这个方法php_strtr(key, key_len, "\t\r\n ", "____", 4); 把key中\t\r\n 这4个字符(后面有个空格)全部替换为"_"字符

    size = sprintf(real_command, "%s ", "delete");
    size += sprintf(real_command + size, "%s ", key);
    size += sprintf(real_command + size, "%s", time_tmp);
    
    real_command [size] = '\0';
  注:把命令写入real_command缓冲中,追加结束符
    efree(time_tmp);
 注:释放资源
    mmc_debug("mmc_delete: trying to delete '%s'", key);
    
    /* drop it! =) */
    if (mmc_sendcmd(mmc, real_command, size) < 0) {
        efree(real_command);
        return -1;
    }
    efree(real_command);
    
    /* get server's response */
    if ((response_buf_size = mmc_readline(mmc)) < 0){
        return -1;
    }
    注:删除失败返回-1
    mmc_debug("mmc_delete: server's response is '%s'", mmc->inbuf);

    /* ok? */
    if(mmc_str_left(mmc->inbuf,"DELETED", response_buf_size, 7)) {
        return 1;
    }
    注:删除成功返回1
    if(mmc_str_left(mmc->inbuf,"NOT_FOUND", response_buf_size, 9)) {
        /* return 0, if such wasn't found */
        return 0;
    }
    注:删除的key不存在,返回0
    /* hmm.. */
    return -1;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值