weboftalent / cachekeyhelper
将部分查询集中到一个查询中以提高性能
Requires
- php: ~5.6|~7.0
- silverstripe/framework: ^4.1
Requires (Dev)
- phpunit/phpunit: ^5.7
- squizlabs/php_codesniffer: ^2.3
This package is auto-updated.
Last update: 2024-09-09 01:14:39 UTC
README
为了提高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') %>