php redis實(shí)現(xiàn)全頁緩存系統(tǒng)

發(fā)布時(shí)間:2024-03-17
推薦:《php視頻教程》《redis教程》
php redis 實(shí)現(xiàn)全頁緩存系統(tǒng)
之前的一個(gè)項(xiàng)目說的一個(gè)功能,需要在后臺預(yù)先存入某個(gè)頁面信息放到數(shù)據(jù)庫,比如app的注冊協(xié)議,用戶協(xié)議,這種.然后在寫成一個(gè)php頁面,app在調(diào)用接口的時(shí)候訪問這個(gè)頁面.當(dāng)時(shí)我就發(fā)現(xiàn)一個(gè)問題,這些協(xié)議往往幾個(gè)月才會修改一次,而每一次用戶查看這些協(xié)議的時(shí)候,nginx都會重新從數(shù)據(jù)庫讀取文件,速度會很慢慢了.
如下圖m_about.php是我生成的數(shù)據(jù)頁,
在虛擬機(jī)環(huán)境下從數(shù)據(jù)庫加載出來重新生成文件需要2.4s(當(dāng)然實(shí)際的測試環(huán)境會快一點(diǎn)).
既然這種頁面數(shù)據(jù)都是更新少,為什么不緩存起來呢,想到之前看的redis常用應(yīng)用里面有一個(gè)全頁緩存系統(tǒng)(full page cache).不如寫一個(gè)試試看.
代碼思路
redis使用的是phpredis擴(kuò)展,當(dāng)然你也可是用predis擴(kuò)展,只不過需要更改里面幾個(gè)讀取函數(shù)而已.
關(guān)于緩存系統(tǒng)的接口,我這里參考了laravel里面cache系統(tǒng).這個(gè)系統(tǒng)的設(shè)計(jì)接口我覺得設(shè)置的很清晰,里面不只是包含redis,還可以使用文件,mysql,memcache.
當(dāng)然全頁緩存用不到那么多東西.只是借用他的函數(shù)設(shè)計(jì).首先是函數(shù)geturltext,這個(gè)是獲取全頁面的數(shù)據(jù),這里沒有想到太多,直接使用file_get_contents,當(dāng)然你也可以改寫成curl函數(shù)
/ * 獲取對應(yīng)的url的信息 * @param string $url 對應(yīng)的地址 * @return boolean|string */ public function geturltext($url) { if (empty($url)) { return false; } return file_get_contents($url); }其次是幾個(gè)借鑒cache系統(tǒng)的函數(shù),remember函數(shù),記憶緩存,這個(gè)是對外的最重要的接口,一般在緩存系統(tǒng)里面直接使用它就好.
/ * 記錄對應(yīng)的緩存,如果之前存在則返回原本的緩存 * @param string $cachename 緩存名 * @param string | callback $urlorcallback 需要緩存的數(shù)據(jù)地址.可以是一個(gè) 網(wǎng)頁地址也一個(gè)可回調(diào)類型,如果不是可回調(diào)類型,則判定是一個(gè)網(wǎng)址 * @param null | int $ttl 緩存過期時(shí)間,如果不過期就是用默認(rèn)值null * @throws \\\\exception 如果無法訪問地址 * @return boolean|string 緩存成功返回獲取到的頁面地址 */ public function remember($cachename, $urlorcallback, $ttl = null) { $value = $this->get($cachename);//檢查緩存是否存在 if (!$value) { //之前沒有使用鍵 if (is_callable($urlorcallback)) { $text = $urlorcallback(); } else { //如果不是回調(diào)類型,則嘗試讀取網(wǎng)址 $text = $this->geturltext($urlorcallback); } if (empty($text)) { throw new \\\\exception('can not get value:' . $urlorcallback); } $this->put($cachename, $text, $ttl); return $text; } else { return $value; } }refresh函數(shù),刷新緩存函數(shù),如果緩存頁面被更新了,就去刷新它.
/ * 更新緩存,并返回當(dāng)前的緩存 * @param string $cachename 緩存名 * @param string | callback $urlorcallback 需要緩存的數(shù)據(jù)地址.可以是一個(gè) 網(wǎng)頁地址也一個(gè)可回調(diào)類型,如果不是可回調(diào)類型,則判定是一個(gè)網(wǎng)址 * @param null | int $ttl 過期時(shí)間,如果不過期就是用默認(rèn)值null * @return boolean|string 緩存成功返回獲取到的頁面地址 */public function refresh($cachename, $urlorcallback, $ttl = null){ $this->delete($cachename); return $this->remember($cachename, $urlorcallback, $ttl);}剩下的兩個(gè)代碼文件.一個(gè)是redisfpc.php,這是全頁緩存的demo,一個(gè)是測試用的文件
fpctest.php
這里是用的是github,連接到我本人的git博客上面.如果連接github有問題,可以看本文最后給的完整代碼.
測試
我們在這里測試,第一次加載因?yàn)樾枰x取對應(yīng)的m_ahout的信息,所以慢一點(diǎn)
第二次加載因?yàn)閺膔edislimian 讀取了,所以會快的多
使用建議
代碼我認(rèn)為已經(jīng)給了足夠多的接口了,在第一次緩存的時(shí)候使用remember函數(shù)記錄緩存,之后如果緩存變化后使用refresh函數(shù),更新緩存即可.如果可能的話,盡量使用ttl設(shè)置緩存的過期時(shí)間.
完整代碼
redisfpc.php
<?phpnamespace redisfpc;class redisfpc{ / * php redis的訪問類 * @var unknown */ private $redis; / * 構(gòu)造函數(shù) * @param array $redis 使用phpredis的類 * @param 是否連接成功 */ public function __construct($redis = []) { //$this->redis = $redis; $this->redis = new \\\\redis(); return $this->redis->connect('127.0.0.1'); } / * 記錄對應(yīng)的緩存,如果之前存在則返回原本的緩存 * @param string $cachename 緩存名 * @param string | callback $urlorcallback 需要緩存的數(shù)據(jù)地址.可以是一個(gè) 網(wǎng)頁地址也一個(gè)可回調(diào)類型,如果不是可回調(diào)類型,則判定是一個(gè)網(wǎng)址 * @param null | int $ttl 緩存過期時(shí)間,如果不過期就是用默認(rèn)值null * @throws \\\\exception 如果無法訪問地址 * @return boolean|string 緩存成功返回獲取到的頁面地址 */ public function remember($cachename, $urlorcallback, $ttl = null) { $value = $this->get($cachename);//檢查緩存是否存在 if (!$value) { //之前沒有使用鍵 if (is_callable($urlorcallback)) { $text = $urlorcallback(); } else { //如果不是回調(diào)類型,則嘗試讀取網(wǎng)址 $text = $this->geturltext($urlorcallback); } if (empty($text)) { throw new \\\\exception('can not get value:' . $urlorcallback); } $this->put($cachename, $text, $ttl); return $text; } else { return $value; } } / * 獲取對應(yīng)的緩存值 * @param string $cache
上一個(gè):萬劍歸宗!值得學(xué)習(xí)總結(jié)的網(wǎng)頁導(dǎo)航設(shè)計(jì)最佳實(shí)踐
下一個(gè):電腦顯卡在哪邊查看(電腦的顯卡在哪里查找)

婚姻幸福的10個(gè)標(biāo)準(zhǔn)
紅米筆記本電腦如何重裝系統(tǒng)win10的教程圖解(紅米筆記本電腦系統(tǒng)怎么重裝win10)
冰柜一級能效和二級哪個(gè)好(冰柜一級能效和二級能效的區(qū)別在哪)
ad9280中文資料和設(shè)計(jì)實(shí)例
主機(jī)開著顯示器顯示無信號,電腦打開主機(jī)后顯示器顯示沒有信號
ssl證書狀態(tài)檢查的是什么 申請SSL證書需要幾個(gè)步驟
六安市有哪些特色美食之旅路線和美景之旅路線推薦
多個(gè)wifi信號合并方法有哪些(多個(gè)wifi信號合并方法是什么)
怎么查域名的ip地址 域名和IP地址究竟是什么關(guān)系
盜竊罪成立條件有哪些
十八禁 网站在线观看免费视频_2020av天堂网_一 级 黄 色 片免费网站_绝顶高潮合集Videos