tractorcow / silverstripe-dynamiccache
基于Silverstripe模块的动态内容即时缓存功能的分支
Requires
- silverstripe/recipe-cms: ^4.2
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文件,而不是框架/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 - (布尔值) 确定是否应针对不同的主机名进行缓存分离。如果在一个系统上为不同的主机名提供不同的内容,但仍然使用相同的后端,例如子站点模块,则非常重要。
- enableAjax - (布尔值) 确定是否在ajax期间启用缓存
- cacheDir - (字符串) 存储基于文件的缓存目录(可以是绝对路径,也可以是相对于 TEMP_FOLDER 的相对路径)。允许使用 %BASE_PATH% 和 %ASSETS_PATH% 占位符。请确保文件夹位于webroot外部,或者已适当加密。
- cacheDuration - (null|整数) 页面缓存的持续时间,单位为秒(默认为1小时)。
- cacheHeaders - (null|string) 确定哪些头部信息也应被缓存。X-Include-CSS 等相关头部信息对于指导前端包含特定的资源文件至关重要。例如:'/^X-/i'
- cacheBackend - (null|string) 如果您想覆盖缓存配置,请将其更改为其他后端,并在您的 _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 的名字来推广或支持由此软件派生的产品。
本软件由版权所有者和贡献者按“原样”提供,不提供任何明示或暗示的保证,包括但不限于适销性和适用于特定目的的暗示保证。在任何情况下,均不承担任何直接、间接、偶然、特殊、示范性或后果性的损害赔偿责任(包括但不限于替代商品或服务的采购;使用、数据或利润的损失;或业务中断),无论此类损害是否因本软件的使用或本软件使用可能性而引起,即使已通知此类损害的可能性。