weboftalent/cachekeyhelper

将部分查询集中到一个查询中以提高性能

安装: 106

依赖关系: 0

建议者: 0

安全性: 0

星级: 10

关注者: 1

分支: 1

开放性问题: 1

类型:silverstripe-vendormodule

2.0.2 2018-06-08 15:04 UTC

This package is auto-updated.

Last update: 2024-09-09 01:14:39 UTC


README

Build StatusScrutinizer Code Quality Scrutinizer codecov.io

Latest Stable Version Latest Unstable Version Total Downloads License Monthly Downloads Daily Downloads

codecov.io

为了提高SilverStripe站点的性能,使用部分缓存来缓存页面片段非常有用,通常是针对一个特定的条件,比如LastEdited字段或周期性时间,例如缓存一个网站的Twitter推送并每5分钟更新一次。当一个项目被编辑时,LastEdited日期将被更新,或者当时间周期结束时,缓存将被“破碎”,页面上相应的部分片段将被新的渲染更新。
虽然这个技术可行,但它仍然需要在页面的每个部分缓存片段上对数据库进行一次击打。那么为什么不将它们全部放在一个查询中呢?

技术

当对网站进行微调时,跟踪以下SQL活动是有用的。在MySQLDatabase.php的query()方法中添加一个trace error_log语句,如下所示

	public function query($sql, $errorLevel = E_USER_ERROR) {
		error_log('SQL:'.$sql);

可以使用类似以下命令来观察SQL跟踪

	tail -f /var/log/apache2/yoursite.silverstripe.errors.log | grep SQL

这有助于确定网站中查询生成的地方。要获取执行的SQL语句的纯数字值,可以使用以下命令的变体

	watch -n 1 'cat /var/log/apache2/yoursite.silverstripe.errors.log | grep SQL | wc -l'

每次加载页面时,将在终端窗口中显示执行的累积SQL语句的数量。需要做一些数学计算,但可以指示你是否在处理10个查询、数百个查询,或者确实是数千个。

安装

SilverStripe 4

composer require "weboftalent/cachekeyhelper:^2"

SilverStripe 3

composer require "weboftalent/cachekeyhelper:^1"

使用方法

配置

对于任何希望在页面上缓存的类,配置对于Pages(扩展SiteTree)和非SiteTree对象略有不同。

在您的站点或模块的_config/目录中创建一个名为cachekeys.yml的文件。默认情况下,Page、Member和Group已经获取了它们最新的LastEdited日期。
例如,如果我们有一个名为Article的类,它扩展了Page,并且该Article有扩展DataObject的Links,那么配置将如下所示

CacheKeyHelper:
  SilverStripe\CMS\Model\SiteTree:
    Article
  SilverStripe\CMS\Model\SiteTree:
    - WebOfTalent\Link\Link

请记住,对配置更改生效需要进行一次/dev/build。

在模板中的使用

缓存项目类

在创建缓存键时,现在可以在模板中使用以下内容

$CacheKey('someprefix','YourClassName')

想象一下这样一个场景,在主页上显示最新的文章和链接。缓存模板代码如下所示

<% cached ID,LastEdited,$CacheKey('articlehomepageslider', 'Article') %>
... render articles here ...
<% end_cached %>

类似地,链接将被缓存

<% cached ID,LastEdited,$CacheKey('linkshomepageportlet', 'Link') %>
... render latest links here ...
<% end_cached %>

缓存当前页面

当前页面被缓存在CurrentPage下

<% cached ID,$CacheKey('contactpage', 'CurrentPage') %>
... render current page here ...
<% end_cached %>

缓存子文件夹渲染

如果正在渲染一个子项文件夹,这是一个常见的表达方式,最新子项的LastEdited日期在ChildPage键下

<% cached ID,$CacheKey('galleryofpics', 'ChildPage') %>
... render gallery of images here ...
<% end_cached %>

缓存同级渲染

当渲染侧边栏菜单时,通常渲染同一文件夹中的页面列表,即同级。相关的LastEdited值存储在SiblingPage键下

<% cached ID,$CacheKey('galleryofpics', 'SiblingPage') %>
... render gallery of images here ...
<% end_cached %>

缓存下拉菜单

对于包含SiteTree前两级的内容的下拉菜单,可以使用cache key TopTwoLevels

<% cached ID,$CacheKey('toplevelmenu', 'TopTwoLevels') %>
... render gallery of images here ...
<% end_cached %>

SiteTree 最后编辑

如果页面上的某个部分需要在任何内容保存时无效,可以使用此键SiteTree。例如,这是一个网站地图的示例。

<% cached $CacheKey('sitemap', 'SiteTree') %>
... rendering of sitemap here ...
<% end_cached %>

站点配置

站点配置被缓存于 SiteConfig 下。

<% cached $CacheKey('siteconfigtagline', 'SiteConfig') %>
... $SiteConfig.TagLine ...
<% end_cached %>

通过参数进行缓存

在搜索结果的情况下,能够通过URL参数进行缓存非常有用。

 <% cached ID,LastEdited,$CacheParamKey('start') %>