1. 程式人生 > >關於YiII框架的擴充套件memcache中set設定時間就get查詢失效的解決方案(版本是1.1.20)

關於YiII框架的擴充套件memcache中set設定時間就get查詢失效的解決方案(版本是1.1.20)

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]