tractorcow/silverstripe-dynamiccache

基于Silverstripe模块的动态内容即时缓存功能的分支

安装: 15,972

依赖关系: 2

建议者: 3

安全: 0

星标: 39

关注者: 5

分支: 27

类型:silverstripe-vendormodule

5.0.0 2023-02-20 01:32 UTC

This package is auto-updated.

Last update: 2024-09-20 05:00:58 UTC


README

此模块无缝且稳健地缓存页面内容,允许后续请求绕过服务器端重操作,如数据库访问。

致谢和作者

需求

  • 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 的名字来推广或支持由此软件派生的产品。

本软件由版权所有者和贡献者按“原样”提供,不提供任何明示或暗示的保证,包括但不限于适销性和适用于特定目的的暗示保证。在任何情况下,均不承担任何直接、间接、偶然、特殊、示范性或后果性的损害赔偿责任(包括但不限于替代商品或服务的采购;使用、数据或利润的损失;或业务中断),无论此类损害是否因本软件的使用或本软件使用可能性而引起,即使已通知此类损害的可能性。