一、配置memcache server 服务器
1.下载memcached软件包,下载地址:
http://pan.baidu.com/s/1boAnghp
解压,把memcached.exe放到随意一个地方,比如:d:/memcached/下(我解压到了我的wampserver的bin目录下与php目录同级)。
2. .windows+R快捷键输入cmd, 在命令行中输入一下代码,切换到memcache.exe的目录下:
3.输入如下代码安装memcache.exe: memcached.exe -d install
4.输入memcached.exe -d start启动
配置成功!
[php]
view plain
copy
Memcache::add Memcache::addServer Memcache::close Memcache::connect memcache_debug Memcache::decrement Memcache::
delete Memcache::
flush Memcache::get Memcache::getExtendedStats Memcache::getServerStatus Memcache::getStats Memcache::getVersion Memcache::increment Memcache::pconnect Memcache::replace Memcache::set Memcache::setCompressThreshold Memcache::setServerParams
二、安装php_memcache.dll扩展
1.首先下载符合你的php版本的php_memcache.dll扩展
地址:
http://pan.baidu.com/s/1skJnZIl
2.复制张贴在你的php/ext文件夹里
3.在php.ini里面添加如下代码,导入扩展:
extension=php_memcache.dll
三、yii里面的配置
1.如果你用的是基础框架:打开config/web.php
如果你用的是高级框架:打开config/main.php
添加如下代码:
[php]
view plain
copy
'cache' => [
'class' =>
'yii\caching\MemCache',
'servers' => [ [
'host' =>
'localhost',
'port' => 11211,
'weight' => 100, ], [
'host' =>
'localhost',
'port' => 11211,
'weight' => 50, ], ], ],
现在就可以在你的控制器的action方法中使用如下代码了:
[php]
view plain
copy
$key=
'key';
$value=
'this is the value'; <pre name=
"code" class=
"php">Yii::
$app->cache->set(
$key,
$value);
echo "lixian";
echo Yii::
$app->cache->get(
$key);
exit();
[php]
view plain
copy
</pre><pre>
但是当你使用过期时间时即:
[php]
view plain
copy
Yii::
$app->cache->set(
$key,
$value,6);
echo "lixian";
echo Yii::
$app->cache->get(
$key);
exit();
就输出不了了,这是该框架自身的一个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问题就解决啦