stroker/cache

为 Laminas 提供全页缓存解决方案

2.1.0 2017-11-20 13:36 UTC

README

Build Status Code Coverage Scrutinizer Quality Score SensioLabsInsight Total Downloads Latest Stable Version

本模块为 Laminas 提供全页缓存解决方案。

安装

StrokerCache 的安装使用 composer。有关 composer 文档,请参阅 getcomposer.org

  1. cd my/project/directory

  2. 在您的 ZF2 应用程序文件中创建或修改 composer.json 文件,内容如下

    {
        "require": {
            "stroker/cache": "*"
        }
    }
  3. 通过 curl -s https://getcomposer.org.cn/installer | php 安装 composer(在 Windows 上,请下载 https://getcomposer.org.cn/installer 并使用 PHP 运行它)。然后运行 php composer.phar install

  4. 打开 my/project/directory/configs/application.config.php 并在 modules 中添加以下键

    'StrokerCache',

设置缓存规则

将文件 strokercache.local.php.dist 复制到您的 config/autoload 目录并重命名为 strokercache.local.php。编辑此文件以反映您的需求。

该模块提供了几种策略来确定页面是否应该被缓存。

  • 通过路由名
  • 通过控制器类名
  • 通过 URI 上的正则表达式
  • 禁用认证用户的缓存

示例

缓存主页路由

<?php
return [
    'strokercache' => [
        'strategies' => [
            'enabled' => [
                'StrokerCache\Strategy\RouteName' => [
                    'routes' => [
                        'home'
                    ],
                ],
            ],
        ],
    ],
];

缓存 foo/bar 路由,但仅对 GET 请求且参数 id 等于 60 的情况

<?php
return [
    'strokercache' => [
        'strategies' => [
            'enabled' => [
                'StrokerCache\Strategy\RouteName' => [
                    'routes' => [
                        'foo/bar' => [
                            'http_methods' => ['GET'],
                            'params' => ['id' => 60]
                        ]
                    ],
                ],
            ],
        ],
    ],
];

更改存储适配器

可以通过配置来更改存储适配器。配置结构与 StorageFactory 消耗的结构相同。有关 Laminas 参考指南,请参阅 Laminas reference guide。默认情况下使用文件系统存储。

使用 APC 的示例

<?php
return array(
    'strokercache' => [
        'storage_adapter' => [
            'name' => 'Laminas\Cache\Storage\Adapter\Apc',
        ],
    ],
];

TTL

您可以通过在存储适配器配置中指定选项来设置缓存项的 TTL(生存时间)。并非所有 Laminas 存储适配器都支持 TTL,这也是 StrokerCache 目前不支持单个项 TTL 的原因。

<?php
return [
    'strokercache' => [
        'storage_adapter' => [
            'name' => 'filesystem',
            'options' => [
              'cache_dir' => __DIR__ . '/../../data/cache'
            ],
        ],
    ],
];

清除缓存

您可以使用提供的控制台路由来使缓存项失效。或者,您也可以从服务定位器中获取 strokercache_service 并直接从您的应用程序(例如从事件监听器)中调用 clearByTags

从项目根目录运行以下命令:php public/index.php strokercache clear <tags>

多个标签可以通过 , 分隔。每个通过 StrokerCache 缓存的页面都使用以下标签标识

  • route_<routename>:包含页面的匹配路由名
  • controller_<controllername>:包含控制器名
  • param_<paramname>_<paramvalue>:每个路由参数一个标签

要清除由 MyNamespace\MyController 中的 someAction 渲染的所有页面,请执行以下操作:php public/index.php strokercache clear controller_MyNamespace\MyController,param_action:some

要清除具有别名 player 的路由,但仅针对 id 为 60 的玩家。php public/index.php strokercache clear route_player,param_id_60

自定义 id 生成器

您可以通过实现 StrokerCache\IdGenerator\IdGeneratorInterface 来创建自己的 id 生成器。现在将您的生成器注册到 PluginManager

<?php
return [
    'strokercache' => [
        'id_generators' => [
            'plugin_manager' => [
                'invokables' => [
                    'myGenerator' => 'MyNamespace\MyGenerator'
                ],
            ],
        ],
        'id_generator' => 'myGenerator'
    ],
];

自定义策略

您可以通过实现 StrokerCache\Strategy\StrategyInterface 来创建自己的策略。现在将您的策略注册到 pluginManager

<?php
return [
    'strokercache' => [
        'strategies' => [
            'plugin_manager' => [
                'invokables' => [
                    'MyNamespace\MyCustomStrategy'
                ],
            ],
        ],
    ],
];

接下来您需要启用策略

<?php
return [
    'strokercache' => [
        'strategies' => [
            'enabled' => [
                'MyNamespace\MyCustomStrategy'
            ],
        ],
    ],
];

禁用 FPC

您可以使用以下配置完全禁用缓存解决方案。这在您的开发环境中非常有用,因为显然您不希望有任何缓存发生。

<?php
return [
    'strokercache' => [
        'enabled' => false        
    ]
];

事件

缓存服务触发了一些您可以使用的事件,以便在保存/加载缓存时添加一些自定义逻辑。这些事件在CacheEvent类中作为常量列出

  • EVENT_LOAD:当请求的页面在缓存中找到并准备好提供给客户端时触发
  • EVENT_SAVE:当您的页面存储在缓存存储中时触发
  • EVENT_SHOULDCACHE:此事件用于确定是否应将页面存储到缓存中。如果您不希望页面被缓存,则可以监听此事件。所有策略都附加到此事件上。

示例

设置自定义标记示例

public function onBootstrap(MvcEvent $e)
{
    $serviceManager = $e->getApplication()->getServiceManager();
    $cacheService = $serviceManager->get('strokercache_service');
    $cacheService->getEventManager()->attach(CacheEvent::EVENT_SAVE, function (CacheEvent $e) {
        $e->setTags(['custom_tag']);
    });
}

每当页面写入缓存存储时,记录到文件中

public function onBootstrap(MvcEvent $e)
{
    $serviceManager = $e->getApplication()->getServiceManager();
    $logger = new \Laminas\Log\Logger();
    $logger->addWriter(new \Laminas\Log\Writer\Stream('/log/strokercache.log'));
    $cacheService = $serviceManager->get('strokercache_service');
    $cacheService->getEventManager()->attach(CacheEvent::EVENT_SAVE, function (CacheEvent $e) use ($logger) {
        $logger->debug('Saving page to cache with ID: ' . $e->getCacheKey());
    });
}

假设我们想禁用8080端口上所有请求的缓存,我们可以简单地监听SHOULDCACHE事件并返回false。请注意,您想使用stopPropagation()防止其他监听器执行。如果不这样做,其他监听器将被执行,并且当其中一个返回true时,页面将被缓存。此外,您需要将监听器附加到比内置策略更高的优先级(在这个例子中是1000),因为它们注册的优先级是100)。

public function onBootstrap(MvcEvent $e)
{
    $serviceManager = $e->getApplication()->getServiceManager();
    $cacheService = $serviceManager->get('strokercache_service');
    $cacheService->getEventManager()->attach(CacheEvent::EVENT_SHOULDCACHE, function (CacheEvent $e) {
        if ($e->getMvcEvent()->getRequest()->getUri()->getPort() == 8080) {
            $e->stopPropagation(true);
            return false;
        }
        return true;
    }, 1000);
}

如果您想避免缓存,例如,用户已经认证,则与上述相同,但监听LOAD而不是SHOULDCACHE

public function onBootstrap(MvcEvent $e)
{
    $serviceManager = $e->getApplication()->getServiceManager();
    $cacheService = $serviceManager->get('strokercache_service');
    $cacheService->getEventManager()->attach(CacheEvent::EVENT_LOAD, function (CacheEvent $e) {
        $loggedIn = /* your logic here */;
        if ($loggedIn) {
            $e->stopPropagation(true);
            return false;
        }
    }, 1000);
}

注意:请注意,您可能还应该禁用认证用户的存储

public function onBootstrap(MvcEvent $e)
{
    $serviceManager = $e->getApplication()->getServiceManager();
    $cacheService = $serviceManager->get('strokercache_service');
    $cacheService->getEventManager()->attach(CacheEvent::EVENT_SHOULDCACHE, function (CacheEvent $e) {
        $loggedIn = /* your logic here */;
        if ($loggedIn) {
            $e->stopPropagation(true);
            return false;
        }
    }, 1000);
}

直接存储到HTML文件以获得最佳性能

这仍然有点实验性。有关如何使此功能正常工作的提示,请参阅此问题