FecShop 缓存

fecshop 有整页缓存和局部缓存

缓存刷新

进入appadmin后台,刷新缓存,具体如图:

appadmin

因为各个入口的redisCache都是独立配置的database,因此,后台刷新缓存,需要加载redis cache的配置, 因此,需要在配置中指定具体的配置文件

打开: @appadmin/config/fecshop_local_services/Fecadmin.php 可以看到配置:

'fecadmin' => [
        'params' => [
            /**
             * Fecshop缓存是基于redis,下面是各个入口redis配置所在的文件路径
             * 1.`commonConfig`是公用部分
             * 2.app开头的key,指的是各个入口的redis所在的配置文件
             * 这个配置的作用,是为了在后台清空各个入口的全部缓存,因此需要加载相应的redis的配置
             */
            'cacheRedisConfigFile' => [
                'commonConfig'      => '@common/config/main-local.php',
                'appAdmin'           => '@appadmin/config/main-local.php',
                'appApi'            => '@appapi/config/main-local.php',
                'appFront'          => '@appfront/config/main-local.php',
                'appHtml5'          => '@apphtml5/config/main-local.php',
                'appServer'         => '@appserver/config/main-local.php',
                
            ],
        ],
    ],

cacheRedisConfigFile: 数组的作用是,指定各个入口的redisCache配置所在文件,其中, commonConfig 是公用redisCache配置。

关于这个功能的具体实现,您可以参看文件:@fecshop\app\appadmin\modules\Fecadmin\block\cache\Index.php

Appfront AppHtml5 入口使用缓存

实现原理为yii2的full page cache

配置:

@appfront/config/fecshop_local_services/Cache.php

具体如下:

return [
	'cache' => [
		/**
		 * cache 总开关,设置false后,无论cacheConfig中的enable
		 * 是否为true,都会全部关闭掉cache。
		 */
		'enable'=> true, 	
		/**
		 * 各个页面cache的配置
		 */
		'cacheConfig'	=> [
			# 分类页面
			'category'  => [
				'enable' 		=> true, 	# 是否开启分类页面的缓存
				'timeout'		=> 3600, 	# 则设置缓存的过期时间,这里设置为秒
				'disableUrlParam' => 'fecshop', # 如果开启缓存,在url加入什么参数后,系统不读取缓存,这个选项是为了方便在不刷新缓存的情况下,查看无缓存的页面是什么样子。
				# url出现的这些参数的值,将参与cache唯一key的生成。
				'cacheUrlParam'	=> [
					# 分页,排序,等参数 
					'p','dir','sort','numPerPage',
					# 侧栏属性过滤等参数
					'price','size','color',
					'style','dresses-length','pattern-type',
					'collar','xinghao','cpu'
				],
			],
			# 产品页面
			'product'  => [
				'enable' 		=> true, 	# 是否开启产品页面的缓存
				'timeout'		=> 3600, 	#则设置缓存的过期时间,这里设置为秒
				'disableUrlParam' => 'fecshop', # 如果开启缓存,在url加入什么参数后,系统不读取缓存,这个选项是为了方便在不刷新缓存的情况下,查看无缓存的页面是什么样子。
			],
			
			# 首页页面
			'home'  => [
				'enable' 		=> true, 	# 是否开启首页页面的缓存
				'timeout'		=> 3600, 	# 则设置缓存的过期时间,这里设置为秒
				'disableUrlParam' => 'fecshop', # 如果开启缓存,在url加入什么参数后,系统不读取缓存,这个选项是为了方便在不刷新缓存的情况下,查看无缓存的页面是什么样子。
			],
			
			# Article(page)页面
			'article'  => [
				'enable' 		=> true, 	# 是否开启Article页面的缓存
				'timeout'		=> 3600, 	# 则设置缓存的过期时间,这里设置为秒
				'disableUrlParam' => 'fecshop',# 如果开启缓存,在url加入什么参数后,系统不读取缓存,这个选项是为了方便在不刷新缓存的情况下,查看无缓存的页面是什么样子。
			],
		],
	],
];

详细看里面的注释代表的具体含义。

开启缓存后,页面的数据将从cache中读取,页面的动态数据部分,会 通过ajax的方式把页面的动态数据加载过来。 通过整页缓存,页面的加载就会非常的快。

Appfront AppHtml5 入口使用局部缓存

局部缓存,相当于一个区块, 譬如fecshop pc端web的menu部分,头部header部分,尾部footer部分等,都可以 通过局部缓存的方式,将其缓存起来, 在购物车,下单,账户中心等内容全部是动态内容,不能做全页缓存的页面, 可以通过局部缓存的方式缓存某些非动态内容的区块, fecshop是通过 page - widget 服务实现的。

首先参看配置文件:

@appfront/config/fecshop_local_services/Page.php , 代码如下:

'widget' => [
	'widgetConfig' => [
		'head' => [
			# 动态数据提供部分
			'class' => 'fecshop\app\appfront\widgets\Head',
			# 根据多模板的优先级,依次去模板找查找该文件,直到找到这个文件。
			'view'  => 'widgets/head.php',
			# 缓存
			'cache' => [
				'enable'	=> false, # 是否开启
				'timeout' 	=> 4500,  # 缓存过期时间
			],
		],
		'header' => [
			'class' => 'fecshop\app\appfront\widgets\Headers',
			# 根据多模板的优先级,依次去模板找查找该文件,直到找到这个文件。
			'view'  => 'widgets/header.php',
			'cache' => [
				'enable'	=> false,
				'timeout' 	=> 4500,
			],
		],
		'topsearch' => [
			'view'  => 'widgets/topsearch.php',
		],
		'menu' => [
			'class' => 'fecshop\app\appfront\widgets\Menu',
			# 根据多模板的优先级,依次去模板找查找该文件,直到找到这个文件。
			'view'  => 'widgets/menu.php',
			'cache' => [
				'enable'	=> false,
				//'timeout' 	=> 4500,
			],
		],
		'footer' => [
			'class' => 'fecshop\app\appfront\widgets\Footer',
			# 根据多模板的优先级,依次去模板找查找该文件,直到找到这个文件。
			'view'  => 'widgets/footer.php',
			'cache' => [
				'enable'	=> false,
				//'timeout' 	=> 4500,
			],
		],
		'scroll' => [
			#'class' => 'fecshop\app\appfront\modules\Cms\block\widgets\Scroll',
			# 根据多模板的优先级,依次去模板找查找该文件,直到找到这个文件。
			'view'  => 'widgets/scroll.php',
		],
		'breadcrumbs' => [
			'view'  => 'widgets/breadcrumbs.php',
		],
		'flashmessage' => [
			'view'  => 'widgets/flashmessage.php',
		],
	]
],

上面是各个区块的配置, 各个区块的调用方式为:

<?= Yii::$service->page->widget->render('menu',$this); ?>

如果上面的配置设置了cache 为开启,并且class对应的动态数据提供对象, 存在函数 getCacheKey ,则可以使用缓存

譬如:head的配置如下,下面定义了cache是否开启,如果设置为true,则 代表开启缓存, timeout代表缓存的过期时间。

'head' => [
			# 动态数据提供部分
			'class' => 'fecshop\app\appfront\widgets\Head',
			# 根据多模板的优先级,依次去模板找查找该文件,直到找到这个文件。
			'view'  => 'widgets/head.php',
			# 缓存
			'cache' => [
				'enable'	=> false, # 是否开启
				'timeout' 	=> 4500,  # 缓存过期时间
			],
		],

上面配置中的class对应的Head.php文件内容为:

<?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。

通过上面的配置可以看出,headheaderfootermenu 都是可以设置局部缓存的。

关于Yii2 cache

更多的参看:Yii2 cache