deviateltd / silverstripe-cacheable
SilverStripe页面和对象缓存
Requires
- silverstripe/cms: >=3.1
- silverstripe/framework: >=3.1
- silverstripe/queuedjobs: >=2.3.1
This package is auto-updated.
Last update: 2024-09-12 12:46:36 UTC
README
Cachable是SilverStripe的对象缓存。它最初是为了仅缓存在网站导航层次结构中通常找到的SiteTree对象而设计的,以提高网站性能。未来版本的目标是允许更多的标准SilverStripe DataObjects进行缓存。
此版本应与PHP 7.2和SilverStripe 3.7兼容
其核心是Zend_Cache,因此该模块可以使用Memcache、Memcached、APCu或File Zend后端缓存。参见:code/_config.php。
安装
- Git Clone
#> git clone https://github.com/deviateltd/silverstripe-cacheable.git
- Composer命令
composer require deviateltd/silverstripe-cacheable dev-master
- Composer(手动)
按照以下方式编辑您的项目composer.json文件
在"require"块下方添加新行
deviateltd/silverstripe-cacheable
在"repositories"块下方添加新块
{
"type": "vcs",
"url": "https://github.com/deviateltd/silverstripe-cacheable.git"
}
现在通过浏览器或命令行运行dev/build - 并且别忘了刷新缓存。
使用方法
在运行CacheableNavigation_Rebuild任务后,将构建缓存。这应该在服务器上的web服务器用户(例如www-data)通过cron任务运行
#> sudo -u www-data /usr/bin/php path/to/framework/cli-script.php dev/tasks/ProcessJobQueueTask queue=2
更好的方法是作为www-data用户以原生方式运行此任务,如下所示,并将上述命令(不带'sudo -u')粘贴到出现的编辑器中 - 如此
#> sudo crontask -u www-data -e
有关更多信息,请参阅QueuedJobs Github wiki。
此任务本身非常消耗内存,因此可以传递一些参数以帮助调试并提高性能
传递以下参数,将缓存重建限制为仅"Live"或仅"Draft"项目,如果知道CMS用户不使用预览模式,或仅对前端进行压力测试,则很有用
Stage=Live
Stage=Stage
默认情况下,BuildTask将"chunk"您的网站树,并使用QueuedJobs模块将每个块推送到后台任务,但是,如果您不需要这样做,例如,您的网站只有几百个页面,则可以跳过它并一次性构建缓存,如下所示
SkipQueue=1
注意:如果您的网站有数百个页面,并且您通过浏览器或使用SkipQueue=1运行任务,您可能会超过PHP的max_execution_time和/或memory_limit ini设置的限制。CLI的优势在于在某些系统(特别是类似Debian的操作系统)中,CLI SAPI会自动分配无限的执行时间和内存限制,而无需手动调用ini_set()。
如果您想为这些任务一次性提高这些PHP设置,请查看PHP的-d开关,它允许您任意覆盖通常使用ini_set()设置的脚本中的设置。
无论如何,我们建议使用带有QueuedJobs的默认模式。
每个缓存对象还会在相关的CMS内容发布、取消发布或删除时被选择性重建。请参阅code/extensions/Cacheable.php中的各种onAfterXX()方法。
使用缓存对象
默认情况下,如果您已经构建了缓存,模块将按照以下方式处理模板中对$Menu()的调用
<% with $CachedData %>
$Menu(1)
<% end_with %>
您还可以直接访问缓存内容,允许您遍历整个SiteTree,使用过滤器等,就像您在PHP逻辑中处理标准的ORM结果列表一样。以下示例显示了如何从ORM或对象缓存中获取您的sitetree的SS_List。
/**
*
* Source all items via ORM or Object cache if available and return the resulting
* list.
*
* @return SS_List|null
*/
public function getSiteTree() {
$list = ArrayList::create();
$modeParts = explode('.', Versioned::get_reading_mode());
$mode = array_pop($modeParts);
if(class_exists('Cacheable')) {
$conf = SiteConfig::current_site_config();
$cacheService = new CacheableNavigationService($mode, $conf);
if($cache = $cacheService->getObjectCache()) {
$list = ArrayList::create($cache->get_site_map());
}
} else {
Versioned::reading_stage($mode);
$list = DataObject::get('Page');
}
return $list;
}
选项
默认情况下,该模块将使用file作为其选择的缓存后端。但是,您可以在项目的YML配置中覆盖此设置。可能的值是memcache、memcached或apc
CacheableConfig:
# Use memcached instead of default `file`
cache_mode: memcached
该模块使用自己的默认“服务器”和“客户端”参数传递给memcached和memcache,但在您的项目的YML配置中可以覆盖这些参数
CacheableConfig:
# Override module defaults for the 'server' array
opts:
memcached:
servers:
host: localhost
port: 11212
weight: 2
client:
9: 1
2: 1
16: true
默认情况下,当用户访问网站时,如果不存在缓存,模块将尝试重建缓存。对于页面对象数量庞大的网站,这可能不是个好主意,您应该在配置中也进行覆盖
CacheableConfig:
# Instruct Cacheable not to build a cache via the "first user pays" approach
build_cache_onload: false
注意:当进行刷新操作时,缓存重建也会被跳过。
可以将Versioned阶段的“阶段”或“Live”传递给Rebuild任务,这将限制缓存重建只针对传递的阶段,因此
#> sudo -u www-data ./framework/sake dev/tasks/CacheableNavigation_Rebuild Stage=Live
默认情况下,只缓存少量类属性和方法。如果您的项目使用了额外的属性/方法,只需相应地修改您的项目config.yml文件即可。例如,如果您在Page类中定义了自定义字段和方法“WibbleField”和“getWibble”,您可以指示模块缓存它们,如下所示
CacheableSiteTree:
cacheable_fields:
- WibbleField
cacheable_functions:
- getWibble
同样,您可以通过CacheableSiteConfig为您自定义的网站配置执行相同的操作。
当使用“file”后端时,Cacheable将对象缓存文件存储在SilverStripe临时文件夹下的名为“cacheable”的目录中。但是,在某些情况下,例如使用Deploynaut部署系统时,SilverStripe的临时目录被删除并重新创建,从而完全截断您的缓存。在这种情况下,您可以在YML配置中使用alt_cache_dir选项,该选项指定一个Deploynaut将保留的替代位置
注意:任何自定义目录位置始终相对于assets目录。这使得缓存可以在那些在其他VM或裸机上将数据库和资产复制/复制的平台上便携。
指示Cacheable在assets/_foo/bar/cacheable下构建缓存
CacheableConfig:
alt_cache_dir: 'foo/bar'
指示Cacheable在assets/_cacheable下构建缓存
CacheableConfig:
alt_cache_dir: cacheable
缓存检查器
如果您有CMS管理员权限,您可以请求一个特定的URL来检查缓存的状态。URI是:/cacheable/inspector,并提供以下信息
- 缓存对象数与数据库导出总数之比 - 对于调试很有用
- 当前正在使用的后端
- 缓存文件列表,文件数,总缓存磁盘使用量,缓存最后更新时间等(仅限“文件”后端)
已知问题
使用仅控制器“页面”的网站不一定与SiteTree对象相关,因此对象缓存中不会有条目可引用。在这些情况下,例如/admin/login,我们默认使用主页的缓存条目。
常见问题解答
Q:为什么到处都有对“CacheableNavigation”的引用?
A:该模块最初是为缓存大菜单/侧边栏/页脚菜单设计的,这些菜单从SilverStripe的$Menu()方法获取列表数据,因为这些网站区域通常是中等规模SilverStripe网站上的性能杀手。这些引用将逐步重构并使模块更加通用。
Q:这个模块与SilverStripe的部分缓存功能相比如何?
答:已经准备了一套全面性能比较的方法,我们正在等待结果。然而,与部分缓存相比,Cacheable在以下方面有所改进:没有用户需要承担初始化缓存的额外开销(1)。使用Cacheable,这通过BuildTask完成,并且额外的好处是避免了罕见的缓存冲撞。
问:这个模块与没有它但有操作码缓存运行的网站相比如何?
答:已经准备了一套全面性能比较的方法,我们正在等待结果。