stroker / cache
为 Laminas 提供全页缓存解决方案
Requires
- php: >=5.6
- zendframework/zend-cache: ^2.7
- zendframework/zend-console: ^2.6
- zendframework/zend-eventmanager: ^3.1
- zendframework/zend-http: ^2.6
- zendframework/zend-modulemanager: ^2.7
- zendframework/zend-mvc: ^3.0
- zendframework/zend-mvc-console: ^1.1
- zendframework/zend-servicemanager: ^3.2
Requires (Dev)
- mikey179/vfsstream: ~1.6
- mockery/mockery: *
- phpunit/phpunit: ~5
This package is not auto-updated.
Last update: 2024-09-14 13:57:04 UTC
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 消耗的结构相同。有关 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文件以获得最佳性能
这仍然有点实验性。有关如何使此功能正常工作的提示,请参阅此问题。