您的位置:首页 > 数据库 > Memcache

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

2013-01-14 16:00 267 查看
根据key从MC中取数据,核心代码如下:

PHP_FUNCTION(memcache_get)

{

zval *id, **key;

注:id 保存当前对象在内存中的地址,key保存键名

mmc_t *mmc;

 注:连接对象

int inx, flags = 0, data_len = 0;

char *data = NULL;

const char *tmp = NULL;

php_unserialize_data_t var_hash;

 注:和store相对就,反序列化对象,后面会用到

if ((id = getThis()) != 0) {  

  注:取不到id说明不是对象调用(应该很熟悉了吧)

if ((inx = mmc_get_connection(id, &mmc TSRMLS_CC)) == 0) {

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中是序列化过的,则进行反序列化处理

PHP_VAR_UNSERIALIZE_INIT(var_hash);

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

php_error_docref(NULL TSRMLS_CC, E_NOTICE, "Error at offset %d of %d bytes", tmp - data, data_len);

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;

}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: