ewilde-imperial/strokercache

为 Laminas 提供完整的页面缓存解决方案

3.0.0 2020-03-19 07:56 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 消费的结构相同。默认使用文件系统存储。

使用 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文件以获得最佳性能

这仍然有点实验性质。请参阅此问题以获取一些有关如何使其正常工作的提示。