sunshineup / silverstripe-dynamiccache
基于 Silverstripe 模块的动态内容即时缓存
Requires
- silverstripe/recipe-cms: ^4.0 || ^5.0
README
本模块能够无缝且稳健地缓存页面内容,允许后续请求绕过数据库访问等服务器重操作。
致谢和作者
- Damian Mooyman - https://github.com/tractorcow/silverstripe-dynamiccache
要求
- SilverStripe 3.1.7 或更高版本
- PHP 5.4
工作原理
当访客请求页面时,模块将尝试在发起数据库连接之前返回任何缓存的页面内容/自定义头。如果存在缓存的副本并可以返回,这可以节省大量的处理开销。
如果不存在缓存的副本,则页面将按正常方式处理,但结果将保存以供后续页面请求使用。
这与 StaticPublisher 或 StaticExporter 不同,因为没有管理缓存。缓存是按页面请求逐个增量执行的,而不是预先执行。这将在多个请求之间分配缓存任务,仅对非缓存请求增加微小的开销,但在管理层面可以节省大量时间。
为了稳健性,在发布页面时,将清除整个缓存。
本模块将允许个别页面通过指定某些头来选择退出缓存,并且将忽略 AJAX 页面或直接请求控制器(包括表单提交)的缓存,通过检查任何以大写字母开头的 URL 段。
安装说明
- 将模块提取到 dynamiccache 文件夹中,或使用 composer 安装
composer require "tractorcow/silverstripe-dynamiccache" "4.2.*"
- 编辑您的 .htaccess(或 web.config 等)以将请求重定向到 dynamiccache/cache-main.php 文件而不是 framework/main.php 文件
RewriteRule .* dynamiccache/cache-main.php?url=%1&%{QUERY_STRING} [L]
配置选项
配置可以通过 Silverstripe 内置的常规配置系统完成。有关可配置选项的列表,请参阅 dynamiccache.yml。
- enabled - (布尔值) 全局覆盖。将其设置为 false 以关闭缓存。
- optInHeader - (null|string) 如果应使用头启用缓存,请在此处设置正则表达式,以匹配指定的头。
- optOutHeader - (null|string) 如果应使用头来显式禁用缓存的缓存,请在此处设置正则表达式,以用于匹配指定的头。例如:'/^X-DynamicCache-OptOut/'
- optInResponseCodes - (null|array) 应缓存的状态代码
- optOutResponseCodes - (null|array) 不应缓存的代码
- responseHeader - (null|string) 用于报告缓存结果的头前缀
- optInURL - (null|string) 如果缓存应仅限于指定的 URL,请在此处设置正则表达式,以用于匹配这些 URL。
- optOutURL - (null|string) 如果缓存应禁用指定的 URL,请在此处设置正则表达式,以用于匹配这些 URL。例如:'/(^/admin)|(/[A-Z])/'
- segmentHostname - (布尔值) 确定是否应为不同的主机名分离缓存。如果运行在不同的主机名下使用相同后端但提供不同内容的系统(如 subsites 模块)时,这很重要。
- enableAjax - (布尔值) 确定是否应在 AJAX 期间启用缓存
- cacheDir - (字符串) 文件缓存存储的目录(可以是绝对路径,也可以是相对于 TEMP_FOLDER 的相对路径)。允许使用 %BASE_PATH% 和 %ASSETS_PATH% 占位符。请确保该文件夹位于 webroot 外部,或者得到适当的保护。
- cacheDuration - (null|整数) 页面缓存的持续时间,以秒为单位(默认为 1 小时)。
- cacheHeaders - (null|字符串) 确定哪些头也应该被缓存。X-Include-CSS 等相关头对于指导前端包含特定的资源文件是必不可少的。例如:'/^X-/i'
- cacheBackend - (null|字符串) 如果您希望覆盖缓存配置,则将其更改为另一个后端,并在您的 _config 文件中初始化新的 SS_Cache 后端
缓存清除
默认情况下,每当 SiteTree 或 SiteConfig 对象更新或删除时,包括发布或取消发布,缓存将被清除。这将一次性清除整个缓存。
为了在其他情况下提示额外的缓存刷新,可能需要在其他情况下清除此缓存。
如果需要在对象更改时执行此操作,应将 DynamicCacheDataObjectExtension
扩展添加到该类型。
如果需要在响应条件或与数据对象无关的操作时执行此操作,则可以使用以下代码显式刷新缓存
DynamicCache::inst()->clear();
此外,如果已登录(或在开发模式中)可以通过添加 'cache=flush' 查询参数来刷新缓存。例如:
http://www.app.com/?cache=flush
自定义缓存行为
如果扩展了 DynamicCache,可以挂钩到两个附加方法。可以使用辅助扩展类 DynamicCacheExtension
来开始。
以下示例将允许在设置了某个会话值时绕过缓存,并按移动/非移动用户对缓存进行分段(假设已安装 silverstripe/mobile 模块)。
class CacheCustomisation extends DynamicCacheExtension { public function updateEnabled(&$enabled) { // Disable caching for this request if a user is logged in if (Member::currentUserID()) $enabled = false; // Disable caching for this request if in dev mode elseif (Director::isDev()) $enabled = false; // Disable caching for this request if we have a message to display // or the request shouldn't be cached for other reasons elseif (Session::get('StatusMessage') || Session::get('Uncachable')) $enabled = false; } public function updateCacheKeyFragments(array &$fragments) { // For any url segment cache between mobile and desktop devices. $fragments[] = MobileBrowserDetector::is_mobile() ? 'mobile' : 'desktop'; } }
许可证
版权(c)2013,Damian Mooyman。保留所有权利。
保留所有权利。
在满足以下条件的情况下,允许重新分配和使用源代码和二进制形式,无论是否修改:
- 源代码重新分配必须保留上述版权声明、本条款列表和以下免责声明。
- 二进制形式的重新分配必须复制上述版权声明、本条款列表和以下免责声明在文档和/或其他与分发一起提供的材料中。
- 未经具体事先书面许可,不得使用 Damian Mooyman 的名字来认可或推广源自本软件的产品。
本软件由版权所有者和贡献者按“原样”提供,不提供任何明示或暗示的保证,包括但不限于适销性和针对特定目的的适用性保证。在任何情况下,无论是否已告知此类损害的可能性,都不承担任何直接、间接、偶然、特殊、示范性或后果性的损害赔偿责任(包括但不限于替代商品或服务的采购;使用、数据或利润的损失;或业务中断),无论此类损害是基于合同、严格责任还是侵权(包括疏忽或其他),即使是在使用本软件时发生的。