根据key从MC中取数据,核心代码如下:
PHP_FUNCTION(memcache_get)
{zval *id, **key;
注:id 保存当前对象在内存中的地址,key保存键名
mmc_t *mmc;
注:连接对象
char *data = NULL;
const char *tmp = NULL;
php_unserialize_data_t var_hash;
注:和store相对就,反序列化对象,后面会用到
if ((id = getThis()) != 0) {
注:取不到id说明不是对象调用(应该很熟悉了吧)
RETURN_FALSE;
}
if (zend_get_parameters_ex(1, &key) == FAILURE) {
WRONG_PARAM_COUNT;
}
注:取参数,key是必选参数
convert_to_string_ex(key);
if (mmc_exec_retrieval_cmd(mmc, "get", Z_STRVAL_PP(key), &flags, &data, &data_len) > 0) {
注:使用get命令从服务器端获取数据,返回数据付给data变量
if (!data || !data_len) {
RETURN_EMPTY_STRING();
}
注:如果没返回数据,或者数据长度不对,返回一个空字符串(不知道这里为什么不做错误处理,而直接回个空字符串)
tmp = data;
if (flags & MMC_SERIALIZED) {
注:如果数据在MC中是序列化过的,则进行反序列化处理
if (!php_var_unserialize(&return_value, &tmp, tmp + data_len, &var_hash TSRMLS_CC)) {
PHP_VAR_UNSERIALIZE_DESTROY(var_hash);
zval_dtor(return_value);
注:释放返回值,走到这一步说明返回值肯定是失败,所以没有考虑返回值共享zval结构问题,直接释放国
zval_dtor参考http://www.cnblogs.com/daiye/archive/2012/03/29/2423671.html
RETURN_FALSE;
}
PHP_VAR_UNSERIALIZE_DESTROY(var_hash);
}
else {RETVAL_STRINGL(data, data_len, 0);
注:否则,直接以字符串方式返回
}
else {
RETURN_FALSE;
}
}
else {
php_error_docref(NULL TSRMLS_CC, E_NOTICE, "memcache_get() should not be called like this. Use $memcache->get($key) instead to get item's value");
RETURN_FALSE;
}
}