關於YiII框架的擴充套件memcache中set設定時間就get查詢失效的解決方案(版本是1.1.20)
阿新 • • 發佈:2018-12-30
0x01 前言
在使用Yii框架的擴充套件memcache快取的時候,儲存資料有一個set方法,來看一下set方法的原型:
public boolean set(string $id, mixed $value, integer $expire=0, ....)
第一個引數時設定鍵名的,第二個引數是設定要快取的值也就是鍵值,第三個引數是設定快取的時間多久失效(預設是0,也就是永遠不失效,如果不為0,最大為30天,也就是2592000秒),如果設定為1,就快取1秒也就是1秒後失效
當不設定快取的時間時,使用get方法獲取鍵值是沒有問題的,如圖:
但是如果設定了時間,那麼get查詢就顯示為空
先重啟一下服務,清除記憶體中的資料(因為快取的資料是在記憶體當中的,服務重啟資料丟失,就是沒了的意思)
顯示為空,就是查詢不到資料
0x02 解決方案
開啟CMemCache.php的原始檔,將註釋(註釋是原始碼)改為紅圈圈(紅圈圈是改完的)中的行。重啟服務後在試一遍
發現成功了
最後等待10秒後(記得將set註釋的,避免重複),快取值消失,達到了最初的目的
0x03 原理
這就是檔案沒有更改時的程式碼,其中$expire就是我們所要設定的快取時間的引數。來看一下if分支,假如我們設定的快取時間不大於0的話,就返回0,也就是永久有效(這個在上面說明過);如果大於0的話,就將快取的時間加上一個time()函式返回的值,當時我看了一下我的time()函式返回的值是1543045753,之後加上我們設定的快取時間就遠遠大於2592000秒(上面有講過)。所以set方法就沒有儲存值,當然也查詢不到,所以get查詢的時候為空
0x04 總結
以上就是set設定時間就get查詢失效的解決方案,也算是YII框架中的一個小bug,原理也講了,希望大家理解
PS:如果認為我這個部落格有什麼問題或者有修改意見的,請一定要告訴我,非常感謝(我的郵箱[email protected])