yii 使用MemCache缓存 存储数据

本文介绍了一个在Yii2框架中使用Memcache时遇到的问题及解决方案。当设置了缓存的有效时间后,无法正常获取到缓存值。通过分析底层代码,找到了问题的原因并给出了修改建议。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

如果你用的是基础框架:打开config/web.php

如果你用的是高级框架:打开config/main.php


下图是高级框架:



代码如下:


 'cache' => [
            'class' => 'yii\caching\MemCache',
            'servers' => [
                [
                    'host' => 'localhost',
                    'port' => 11211,
                    'weight' => 100,
                ],
                [
                    'host' => 'localhost',
                    'port' => 11211,
                    'weight' => 50,
                ],
            ],
        ],

然后就可以在方法里写代码了,这是我写的一个获取注册验证码时写的存取memcacher:

//验证码 memcache
        $key = $email;
        $value = rand( 100000 , 999999 );

        Yii::$app->cache->set( $key , $value , 60*5 );//过期时间为5分钟

     Yii::$app->cache->get( $key );//获取验证码

输出的就是随机生成的验证码,有效期5分钟。

就输出不了,这是该框架自身的一个bug,解决办法如下:
在yii2使用memcache前根据文档配置好相应的参数,在使用memcache(非memcached)过程中会发现Yii::$app->cache->set('key','value');当这句话没有设置有效时间为多少秒时,可以正常获取到缓存中键为key的值,但表示此key不过期。当设置了有效时间时,Yii::$app->cache->set('key','value',60);比如60秒,就会出现取不到key对应的value值,网上和论坛里搜了搜,没有找到解决办法,也有很多phper遇到这类似的问题。所以特意去看了看底层代码,引用的memcache类为Yii2自带的yii\caching\MemCache,Yii::$app->cache->set('key','value')这句代码会自动调用memcache类下的setValue方法来设置缓存,所以问题也许就出现在这儿了。后面经过测试,发现这个方法最后一句return $this->useMemcached ? $this->_cache->set($key, $value, $expire) : $this->_cache->set($key, $value, 0, $expire)的问题,将这句代码改为return $this->useMemcached ? $this->_cache->set($key, $value, $expire) : $this->_cache->set($key, $value, 0, $duration)后,再测试发现问题已经解决,原因则是这句return代码里使用memcache时调用的$this->_cache->set($key, $value, 0, $expire),相当于$mem = new Memcache();$mem->set($key,$value,0,$expire);这里最关键的一点是:memcache要设置的时间的含义是有效时间为多少秒,memcached要设置的时间的含义是在哪一秒到期(等效于time()+$duration),所以发现问题所在之后将原来代码里的第二个$expire改成$duration问题就解决啦。



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值