fecshop 有整頁(yè)緩存和局部緩存
實(shí)現(xiàn)原理為yii2的full page cache
配置:
@appfront/config/fecshop_local_services/Cache.php
具體如下:
return [
'cache' => [
/**
* cache 總開(kāi)關(guān),設(shè)置false后,無(wú)論cacheConfig中的enable
* 是否為true,都會(huì)全部關(guān)閉掉cache。
*/
'enable'=> true,
/**
* 各個(gè)頁(yè)面cache的配置
*/
'cacheConfig' => [
# 分類頁(yè)面
'category' => [
'enable' => true, # 是否開(kāi)啟分類頁(yè)面的緩存
'timeout' => 3600, # 則設(shè)置緩存的過(guò)期時(shí)間,這里設(shè)置為秒
'disableUrlParam' => 'fecshop', # 如果開(kāi)啟緩存,在url加入什么參數(shù)后,系統(tǒng)不讀取緩存,這個(gè)選項(xiàng)是為了方便在不刷新緩存的情況下,查看無(wú)緩存的頁(yè)面是什么樣子。
# url出現(xiàn)的這些參數(shù)的值,將參與cache唯一key的生成。
'cacheUrlParam' => [
# 分頁(yè),排序,等參數(shù)
'p','dir','sort','numPerPage',
# 側(cè)欄屬性過(guò)濾等參數(shù)
'price','size','color',
'style','dresses-length','pattern-type',
'collar','xinghao','cpu'
],
],
# 產(chǎn)品頁(yè)面
'product' => [
'enable' => true, # 是否開(kāi)啟產(chǎn)品頁(yè)面的緩存
'timeout' => 3600, #則設(shè)置緩存的過(guò)期時(shí)間,這里設(shè)置為秒
'disableUrlParam' => 'fecshop', # 如果開(kāi)啟緩存,在url加入什么參數(shù)后,系統(tǒng)不讀取緩存,這個(gè)選項(xiàng)是為了方便在不刷新緩存的情況下,查看無(wú)緩存的頁(yè)面是什么樣子。
],
# 首頁(yè)頁(yè)面
'home' => [
'enable' => true, # 是否開(kāi)啟首頁(yè)頁(yè)面的緩存
'timeout' => 3600, # 則設(shè)置緩存的過(guò)期時(shí)間,這里設(shè)置為秒
'disableUrlParam' => 'fecshop', # 如果開(kāi)啟緩存,在url加入什么參數(shù)后,系統(tǒng)不讀取緩存,這個(gè)選項(xiàng)是為了方便在不刷新緩存的情況下,查看無(wú)緩存的頁(yè)面是什么樣子。
],
# Article(page)頁(yè)面
'article' => [
'enable' => true, # 是否開(kāi)啟Article頁(yè)面的緩存
'timeout' => 3600, # 則設(shè)置緩存的過(guò)期時(shí)間,這里設(shè)置為秒
'disableUrlParam' => 'fecshop',# 如果開(kāi)啟緩存,在url加入什么參數(shù)后,系統(tǒng)不讀取緩存,這個(gè)選項(xiàng)是為了方便在不刷新緩存的情況下,查看無(wú)緩存的頁(yè)面是什么樣子。
],
],
],
];
詳細(xì)看里面的注釋代表的具體含義。
開(kāi)啟緩存后,頁(yè)面的數(shù)據(jù)將從cache中讀取,頁(yè)面的動(dòng)態(tài)數(shù)據(jù)部分,會(huì) 通過(guò)ajax的方式把頁(yè)面的動(dòng)態(tài)數(shù)據(jù)加載過(guò)來(lái)。 通過(guò)整頁(yè)緩存,頁(yè)面的加載就會(huì)非常的快。
局部緩存,相當(dāng)于一個(gè)區(qū)塊, 譬如fecshop pc端web的menu部分,頭部header部分,尾部footer部分等,都可以 通過(guò)局部緩存的方式,將其緩存起來(lái), 在購(gòu)物車,下單,賬戶中心等內(nèi)容全部是動(dòng)態(tài)內(nèi)容,不能做全頁(yè)緩存的頁(yè)面, 可以通過(guò)局部緩存的方式緩存某些非動(dòng)態(tài)內(nèi)容的區(qū)塊, fecshop是通過(guò) page - widget 服務(wù)實(shí)現(xiàn)的。
首先參看配置文件:
@appfront/config/fecshop_local_services/Page.php , 代碼如下:
'widget' => [
'widgetConfig' => [
'head' => [
# 動(dòng)態(tài)數(shù)據(jù)提供部分
'class' => 'fecshop\app\appfront\widgets\Head',
# 根據(jù)多模板的優(yōu)先級(jí),依次去模板找查找該文件,直到找到這個(gè)文件。
'view' => 'widgets/head.php',
# 緩存
'cache' => [
'enable' => false, # 是否開(kāi)啟
'timeout' => 4500, # 緩存過(guò)期時(shí)間
],
],
'header' => [
'class' => 'fecshop\app\appfront\widgets\Headers',
# 根據(jù)多模板的優(yōu)先級(jí),依次去模板找查找該文件,直到找到這個(gè)文件。
'view' => 'widgets/header.php',
'cache' => [
'enable' => false,
'timeout' => 4500,
],
],
'topsearch' => [
'view' => 'widgets/topsearch.php',
],
'menu' => [
'class' => 'fecshop\app\appfront\widgets\Menu',
# 根據(jù)多模板的優(yōu)先級(jí),依次去模板找查找該文件,直到找到這個(gè)文件。
'view' => 'widgets/menu.php',
'cache' => [
'enable' => false,
//'timeout' => 4500,
],
],
'footer' => [
'class' => 'fecshop\app\appfront\widgets\Footer',
# 根據(jù)多模板的優(yōu)先級(jí),依次去模板找查找該文件,直到找到這個(gè)文件。
'view' => 'widgets/footer.php',
'cache' => [
'enable' => false,
//'timeout' => 4500,
],
],
'scroll' => [
#'class' => 'fecshop\app\appfront\modules\Cms\block\widgets\Scroll',
# 根據(jù)多模板的優(yōu)先級(jí),依次去模板找查找該文件,直到找到這個(gè)文件。
'view' => 'widgets/scroll.php',
],
'breadcrumbs' => [
'view' => 'widgets/breadcrumbs.php',
],
'flashmessage' => [
'view' => 'widgets/flashmessage.php',
],
]
],
上面是各個(gè)區(qū)塊的配置, 各個(gè)區(qū)塊的調(diào)用方式為:
<?= Yii::$service->page->widget->render('menu',$this); ?>
如果上面的配置設(shè)置了cache 為開(kāi)啟,并且class對(duì)應(yīng)的動(dòng)態(tài)數(shù)據(jù)提供對(duì)象, 存在函數(shù) getCacheKey ,則可以使用緩存
譬如:head的配置如下,下面定義了cache是否開(kāi)啟,如果設(shè)置為true,則 代表開(kāi)啟緩存, timeout代表緩存的過(guò)期時(shí)間。
'head' => [
# 動(dòng)態(tài)數(shù)據(jù)提供部分
'class' => 'fecshop\app\appfront\widgets\Head',
# 根據(jù)多模板的優(yōu)先級(jí),依次去模板找查找該文件,直到找到這個(gè)文件。
'view' => 'widgets/head.php',
# 緩存
'cache' => [
'enable' => false, # 是否開(kāi)啟
'timeout' => 4500, # 緩存過(guò)期時(shí)間
],
],
上面配置中的class對(duì)應(yīng)的Head.php文件內(nèi)容為:
<?php
namespace fecshop\app\appfront\widgets;
use Yii;
use fecshop\interfaces\block\BlockCache;
class Head implements BlockCache
{
public function getLastData()
{
return [
];
}
public function getCacheKey(){
$store = Yii::$service->store->currentStore;
$moduleId = Yii::$app->controller->module->id;
$controllerId = Yii::$app->controller->id;
$actionId = Yii::$app->controller->action->id;
$urlPathKey = $moduleId.'_'.$controllerId.'_'.$actionId;
return self::BLOCK_CACHE_PREFIX.'_'.$store.'_'.$urlPathKey;
}
}
getCacheKey()
返回的是cache的唯一key。
通過(guò)上面的配置可以看出,head
, header
, footer
, menu
都是可以設(shè)置局部緩存的。
更多建議: