deviateltd/silverstripe-cacheable

该软件包最新版本(1.0.4)没有可用的许可证信息。

SilverStripe页面和对象缓存

安装次数: 2,746

依赖关系: 0

建议者: 0

安全性: 0

星标: 6

关注者: 4

分支: 2

公开问题: 19

类型:silverstripe-module

1.0.4 2019-04-12 00:56 UTC

README

Cachable是SilverStripe的对象缓存。它最初是为了仅缓存在网站导航层次结构中通常找到的SiteTree对象而设计的,以提高网站性能。未来版本的目标是允许更多的标准SilverStripe DataObjects进行缓存。

此版本应与PHP 7.2和SilverStripe 3.7兼容

其核心是Zend_Cache,因此该模块可以使用Memcache、Memcached、APCu或File Zend后端缓存。参见:code/_config.php

安装

  1. Git Clone
#> git clone https://github.com/deviateltd/silverstripe-cacheable.git
  1. Composer命令
composer require deviateltd/silverstripe-cacheable dev-master
  1. 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配置中覆盖此设置。可能的值是memcachememcachedapc

CacheableConfig:
  # Use memcached instead of default `file`
  cache_mode: memcached

该模块使用自己的默认“服务器”和“客户端”参数传递给memcachedmemcache,但在您的项目的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完成,并且额外的好处是避免了罕见的缓存冲撞

问:这个模块与没有它但有操作码缓存运行的网站相比如何?

答:已经准备了一套全面性能比较的方法,我们正在等待结果。

脚注

  1. 这仅在您的项目覆盖默认模块行为时才成立,例如

    CacheableConfig

    指示Cacheable不要通过“首个用户付费”的方法构建缓存

    build_cache_onload: false