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