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

根据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;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值