前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >关于Yii2使用memcache时的一个底层bug,目前官方还没有更新

关于Yii2使用memcache时的一个底层bug,目前官方还没有更新

作者头像
友儿
发布2022-09-09 17:46:02
2790
发布2022-09-09 17:46:02
举报
文章被收录于专栏:友儿友儿

测试框架版本说明

  • 测试yii2版本
代码语言:javascript
复制
77103@DESKTOP-C2JB47R MINGW64 /e/dev/basic
$ ./yii

This is Yii version 2.0.15.1.

The following commands are available:

配置文件

  • 配置memcache,在web.php / main.php 中配置
代码语言:javascript
复制
'components' => [
      //数据缓存到memcache
      'cache' => [
          'class' => 'yiicachingMemCache',
          'servers' => [
              [
                  'host' => 'localhost',
                  'port' => 11211,
                  'weight' => 100,
              ]
          ],
      ],

代码1

代码语言:javascript
复制
<?php

namespace app\controllers;

use yii\web\Controller;
use Yii;

class TestController extends Controller
{

  public function actionIndex()
  {
      $key = 'people';
      $value = json_encode(array('name'=>'ball', 'age'=>'male'));
      $expire = 60000;
      yii::$app->cache->set($key, $value,$expire);
      $data =Yii::$app->cache->get($key);
      \Logic::vd($data);
  }
}
// 结果:bool(false) 

代码2

代码语言:javascript
复制
<?php

namespace app\controllers;

use yii\web\Controller;
use Yii;

class TestController extends Controller
{

  public function actionIndex()
  {
      $key = 'people';
      $value = json_encode(array('name'=>'ball', 'age'=>'male'));
      $expire = 60000;
      yii::$app->cache->set($key, $value);
      $data =Yii::$app->cache->get($key);
      \Logic::vd($data);
  }
}
//结果:string(28) "{"name":"ball","age":"male"}"
  • 解决
  • 在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问题就解决啦,因为发现是个系统bug, 所以在论坛里来告诉大家一下,再有小伙伴遇到这个问题直接改一下这里就好, 还有如果哪位小伙伴有精神可以告诉下yii2开发团队, 下次yii升级的时候就可以修复这个bug了,暂时没修复时小伙伴们就照我上面说的改一下就可以用了。
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 测试框架版本说明
  • 代码1
  • 代码2
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档