Yii框架如何正確使用MemCache緩存

Yii框架如何正確使用MemCache緩存

具體操作如下所示:

(圖文教程推薦:yii

一、配置memcache server 服務(wù)器

1、下載memcached軟件包,下載地址:

http://pan.baidu.com/s/1boAnghp

解壓,把memcached.exe放到隨意一個地方,比如:d:/memcached/下(我解壓到了我的wampserver的bin目錄下與php目錄同級)。

2、windows+R快捷鍵輸入cmd, 在命令行中輸入一下代碼,切換到memcache.exe的目錄下:

Yii框架如何正確使用MemCache緩存

3、輸入如下代碼安裝memcache.exe: memcached.exe -d install

Yii框架如何正確使用MemCache緩存

4、輸入memcached.exe -d start啟動

Yii框架如何正確使用MemCache緩存

配置成功

//memcache常用的函數(shù): Memcache::add???//添加一個值,如果已經(jīng)存在,則返回false Memcache::addServer??//?添加一個可供使用的服務(wù)器地址 Memcache::close???//關(guān)閉一個Memcache對象 Memcache::connect??//?創(chuàng)建一個Memcache對象 memcache_debug??//?控制調(diào)試功能 Memcache::decrement??//?對保存的某個key中的值進(jìn)行減法操作 Memcache::delete???//刪除一個key值 Memcache::flush??//?清除所有緩存的數(shù)據(jù) Memcache::get???//獲取一個key值 Memcache::getExtendedStats???//獲取進(jìn)程池中所有進(jìn)程的運(yùn)行系統(tǒng)統(tǒng)計 Memcache::getServerStatus//?獲取運(yùn)行服務(wù)器的參數(shù) Memcache::getStats???//返回服務(wù)器的一些運(yùn)行統(tǒng)計信息 Memcache::getVersion???//返回運(yùn)行的Memcache的版本信息 Memcache::increment???//對保存的某個key中的值進(jìn)行加法操作 Memcache::pconnect??//?創(chuàng)建一個Memcache的持久連接對象 Memcache::replace???//對一個已有的key進(jìn)行覆寫操作 Memcache::set???//添加一個值,如果已經(jīng)存在,則覆寫 Memcache::setCompressThreshold???//對大于某一大小的數(shù)據(jù)進(jìn)行壓縮 Memcache::setServerParams???//在運(yùn)行時修改服務(wù)器的參數(shù)

二、安裝php_memcache.dll擴(kuò)展

1、首先下載符合你的php版本的php_memcache.dll擴(kuò)展

地址:

http://pan.baidu.com/s/1skJnZIl

2、復(fù)制張貼在你的php/ext文件夾里

3、在php.ini里面添加如下代碼,導(dǎo)入擴(kuò)展:

extension=php_memcache.dll

三、yii里面的配置

1.如果你用的是基礎(chǔ)框架:打開config/web.php

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

添加如下代碼:

'cache'?=>?[ ????'class'?=>?'yiicachingMemCache', ????'servers'?=>?[ ????????[ ????????????'host'?=>?'localhost', ????????????'port'?=>?11211, ????????????'weight'?=>?100, ????????], ????????[ ????????????'host'?=>?'localhost', ????????????'port'?=>?11211, ????????????'weight'?=>?50, ????????], ????], ],

現(xiàn)在就可以在你的控制器的action方法中使用如下代碼了:

//緩存MemCache ? $key='key'; $value='this?is?the?value'; <pre class="brush:php;toolbar:false">Yii::$app-&gt;cache-&gt;set($key,$value); echo?"lixian"; echo?Yii::$app-&gt;cache-&gt;get($key); exit();


但是當(dāng)你使用過期時間時即:

Yii::$app-&gt;cache-&gt;set($key,$value,6);//過期時間為6s echo?"lixian"; echo?Yii::$app-&gt;cache-&gt;get($key); exit();

就輸出不了了,這是該框架自身的一個bug,解決辦法如下:

在yii2使用memcache前根據(jù)文檔配置好相應(yīng)的參數(shù),在使用memcache(非memcached)過程中會發(fā)現(xiàn) Yii::$app->cache->set(‘key’,’value’); 當(dāng)這句話沒有設(shè)置有效時間為多少秒時,可以正常獲取到緩存中鍵為key的值,但表示此key不過期。

當(dāng)設(shè)置了有效時間時, Yii::$app->cache->set(‘key’,’value’,60); 比如60秒,就會出現(xiàn)取不到key對應(yīng)的value值,網(wǎng)上和論壇里搜了搜,沒有找到解決辦法,也有很多phper遇到這類似的問題。所以特意去看了看底層代碼,引用的memcache類為Yii2自帶的yiicachingMemCache, Yii::$app->cache->set(‘key’,’value’) 這句代碼會自動調(diào)用memcache類下的setValue方法來設(shè)置緩存,所以問題也許就出現(xiàn)在這兒了。

后面經(jīng)過測試,發(fā)現(xiàn)這個方法最后一句 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) 后,再測試發(fā)現(xiàn)問題已經(jīng)解決。

原因則是這句return代碼里使用memcache時調(diào)用的 $this->_cache->set($key, $value, 0, $expire) ,相當(dāng)于 $mem = new Memcache();$mem->set($key,$value,0,$expire); 這里最關(guān)鍵的一點(diǎn)是:memcache要設(shè)置的時間的含義是有效時間為多少秒,memcached要設(shè)置的時間的含義是在哪一秒到期(等效于time()+$duration),所以發(fā)現(xiàn)問題所在之后將原來代碼里的第二個$expire改成$duration問題就解決了。

? 版權(quán)聲明
THE END
喜歡就支持一下吧
點(diǎn)贊8 分享