从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;
}