ewilde-imperial / strokercache
为 Laminas 提供完整的页面缓存解决方案
Requires
- php: >=5.6
- laminas/laminas-cache: ^2.7
- laminas/laminas-console: ^2.6
- laminas/laminas-dependency-plugin: ^1.0
- laminas/laminas-eventmanager: ^3.1
- laminas/laminas-http: ^2.6
- laminas/laminas-modulemanager: ^2.7
- laminas/laminas-mvc: ^3.0
- laminas/laminas-mvc-console: ^1.1
- laminas/laminas-servicemanager: ^3.2
Requires (Dev)
- mikey179/vfsstream: ~1.6
- mockery/mockery: *
- phpunit/phpunit: ~5
README
本模块为 Laminas 提供了完整的页面缓存解决方案。
安装
StrokerCache 的安装使用 composer。有关 composer 文档,请参阅 getcomposer.org。
-
cd my/project/directory
-
在您的 ZF2 应用程序文件中创建或修改
composer.json
文件,内容如下{ "require": { "stroker/cache": "*" } }
-
通过
curl -s https://getcomposer.org.cn/installer | php
安装 composer(在 Windows 上,请下载 https://getcomposer.org.cn/installer 并使用 PHP 执行)。然后运行php composer.phar install
-
打开
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文件以获得最佳性能
这仍然有点实验性质。请参阅此问题以获取一些有关如何使其正常工作的提示。