小編給大家分享一下php+redis如何實現(xiàn)全頁緩存系統(tǒng),相信大部分人都還不怎么了解,因此分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后大有收獲,下面讓我們一起去了解一下吧!
博州ssl適用于網(wǎng)站、小程序/APP、API接口等需要進行數(shù)據(jù)傳輸應用場景,ssl證書未來市場廣闊!成為成都創(chuàng)新互聯(lián)的ssl證書銷售渠道,可以享受市場價格4-6折優(yōu)惠!如果有意向歡迎電話聯(lián)系或者加微信:028-86922220(備注:SSL證書合作)期待與您的合作!
php redis 實現(xiàn)全頁緩存系統(tǒng)
之前的一個項目說的一個功能,需要在后臺預先存入某個頁面信息放到數(shù)據(jù)庫,比如app的注冊協(xié)議,用戶協(xié)議,這種.然后在寫成一個php頁面,app在調(diào)用接口的時候訪問這個頁面.當時我就發(fā)現(xiàn)一個問題,這些協(xié)議往往幾個月才會修改一次,而每一次用戶查看這些協(xié)議的時候,nginx都會重新從數(shù)據(jù)庫讀取文件,速度會很慢慢了.
如下圖m_about.php是我生成的數(shù)據(jù)頁,

在虛擬機環(huán)境下從數(shù)據(jù)庫加載出來重新生成文件需要2.4s(當然實際的測試環(huán)境會快一點).
既然這種頁面數(shù)據(jù)都是更新少,為什么不緩存起來呢,想到之前看的redis常用應用里面有一個全頁緩存系統(tǒng)(full page cache).不如寫一個試試看.
代碼思路
redis使用的是phpredis擴展,當然你也可是用predis擴展,只不過需要更改里面幾個讀取函數(shù)而已.
關(guān)于緩存系統(tǒng)的接口,我這里參考了laravel里面cache系統(tǒng).這個系統(tǒng)的設計接口我覺得設置的很清晰,里面不只是包含redis,還可以使用文件,MySQL,memcache.
當然全頁緩存用不到那么多東西.只是借用他的函數(shù)設計.首先是函數(shù)getUrlText,這個是獲取全頁面的數(shù)據(jù),這里沒有想到太多,直接使用file_get_contents,當然你也可以改寫成curl函數(shù)
/**
* 獲取對應的url的信息
* @param string $url 對應的地址
* @return boolean|string
*/
public function getUrlText($url)
{
if (empty($url)) {
return false;
}
return file_get_contents($url);
}其次是幾個借鑒cache系統(tǒng)的函數(shù),remember函數(shù),記憶緩存,這個是對外的最重要的接口,一般在緩存系統(tǒng)里面直接使用它就好.
/**
* 記錄對應的緩存,如果之前存在則返回原本的緩存
* @param string $cacheName 緩存名
* @param string | callback $urlOrCallback 需要緩存的數(shù)據(jù)地址.可以是一個 網(wǎng)頁地址也一個可回調(diào)類型,如果不是可回調(diào)類型,則判定是一個網(wǎng)址
* @param null | int $ttl 緩存過期時間,如果不過期就是用默認值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ù),如果緩存頁面被更新了,就去刷新它.
/**
* 更新緩存,并返回當前的緩存
* @param string $cacheName 緩存名
* @param string | callback $urlOrCallback 需要緩存的數(shù)據(jù)地址.可以是一個 網(wǎng)頁地址也一個可回調(diào)類型,如果不是可回調(diào)類型,則判定是一個網(wǎng)址
* @param null | int $ttl 過期時間,如果不過期就是用默認值null
* @return boolean|string 緩存成功返回獲取到的頁面地址
*/
public function refresh($cacheName, $urlOrCallback, $ttl = null)
{
$this->delete($cacheName);
return $this->remember($cacheName, $urlOrCallback, $ttl);
}剩下的兩個代碼文件.一個是redisFPC.php,這是全頁緩存的demo,一個是測試用的文件
fpcTest.php
這里是用的是github,連接到我本人的git博客上面.如果連接github有問題,可以看本文最后給的完整代碼.
測試
我們在這里測試,第一次加載因為需要讀取對應的m_ahout的信息,所以慢一點

第二次加載因為從redislimian 讀取了,所以會快的多
使用建議
代碼我認為已經(jīng)給了足夠多的接口了,在第一次緩存的時候使用remember函數(shù)記錄緩存,之后如果緩存變化后使用refresh函數(shù),更新緩存即可.如果可能的話,盡量使用ttl設置緩存的過期時間.
完整代碼
redisFPC.php
<?php
namespace 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');
}
/**
* 記錄對應的緩存,如果之前存在則返回原本的緩存
* @param string $cacheName 緩存名
* @param string | callback $urlOrCallback 需要緩存的數(shù)據(jù)地址.可以是一個 網(wǎng)頁地址也一個可回調(diào)類型,如果不是可回調(diào)類型,則判定是一個網(wǎng)址
* @param null | int $ttl 緩存過期時間,如果不過期就是用默認值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;
}
}
/**
* 獲取對應的緩存值
* @param string $cacheName 緩存名
* @return String | Bool,如果不存在返回false,否則返回對應的緩存頁信息
*/
public function get($cacheName)
{
return $this->redis->get($this->getKey($cacheName));
}
/**
* 將對應的全頁緩存保存到對應redis中
* @param string $cacheName 緩存名
* @param string $value
* @param null | int $ttl 過期時間,如果不過期就是用默認值null
* @return boolean 保存成功返回true
*/
public function put($cacheName, $value, $ttl = null)
{
if (is_null($ttl)) {
return $this->redis->set($this->getKey($cacheName), $value);
} else {
return $this->redis->set($this->getKey($cacheName), $value, $ttl);
}
}
/**
* 刪除對應緩存
* @param string $cacheName 緩存名
*/
public function delete($cacheName)
{
return $this->redis->delete($this->getKey($cacheName));
}
/**
* 更新緩存,并返回當前的緩存
* @param string $cacheName 緩存名
* @param string | callback $urlOrCallback 需要緩存的數(shù)據(jù)地址.可以是一個 網(wǎng)頁地址也一個可回調(diào)類型,如果不是可回調(diào)類型,則判定是一個網(wǎng)址
* @param null | int $ttl 過期時間,如果不過期就是用默認值null
* @return boolean|string 緩存成功返回獲取到的頁面地址
*/
public function refresh($cacheName, $urlOrCallback, $ttl = null)
{
$this->delete($cacheName);
return $this->remember($cacheName, $urlOrCallback, $ttl);
}
/**
* 獲取對應的url的信息
* @param string $url 對應的地址
* @return boolean|string
*/
public function getUrlText($url)
{
if (empty($url)) {
return false;
}
return file_get_contents($url);
}
/**
* 生成全頁緩存鍵名
* @param string $cacheName 需要緩存的名稱
* @return string 對應的在redis中的鍵名
*/
private function getKey($cacheName)
{
return 'FPC:'. $cacheName;
}
}測試用的test代碼
注意這里的url寫的是本地的緩存url
<?php
use RedisFPC\RedisFPC;
require_once 'redisFPC.php';
/* $text = file_get_contents('http://localhost:1002/m_about.php');
var_dump($text); */
$url = 'http://localhost:1002/m_about.php';
$fpc = new RedisFPC();
echo $fpc->remember('服務協(xié)議', $url, 60*60*24);以上是php+redis如何實現(xiàn)全頁緩存系統(tǒng)的所有內(nèi)容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內(nèi)容對大家有所幫助,如果還想學習更多知識,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道!
網(wǎng)站名稱:php+redis如何實現(xiàn)全頁緩存系統(tǒng)
當前地址:http://www.js-pz168.com/article30/gcjpso.html
成都網(wǎng)站建設公司_創(chuàng)新互聯(lián),為您提供域名注冊、網(wǎng)站排名、品牌網(wǎng)站建設、網(wǎng)站建設、外貿(mào)建站、商城網(wǎng)站
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)