Symfony中能否从控制器删除缓存池内的所有缓存?
Symfony 4.4 memcached缓存池全量清空实现方案
你可以直接使用Symfony缓存组件自带的清空方法实现需求,无需逐个指定缓存键删除,具体实现如下:
核心实现逻辑
Symfony为缓存池提供了ClearableCacheInterface接口,memcached驱动默认支持该接口,你注入的contactsCache缓存池实例可直接调用clear()方法清空当前池的所有缓存。
修改后的代码示例
use Symfony\Contracts\Cache\CacheInterface; use Symfony\Component\Cache\Adapter\ClearableCacheInterface; use Symfony\Component\EventDispatcher\EventSubscriberInterface; use Symfony\Component\HttpKernel\Event\ViewEvent; use Symfony\Component\HttpKernel\KernelEvents; use Symfony\Component\HttpKernel\Event\TerminateEvent; use Symfony\Component\HttpFoundation\Request; class ContactsSubscriber implements EventSubscriberInterface { private $contactsCache; public function __construct( CacheInterface $contactsCache ){ $this->contactsCache = $contactsCache; } public static function getSubscribedEvents() { // 方案1:沿用原VIEW事件逻辑,在数据写入后执行清空 return [ KernelEvents::VIEW => ['renewCache', EventPriorities::POST_WRITE] ]; // 方案2:如需不影响响应速度,可改用TERMINATE事件,响应发送后再执行清空 // return [ // KernelEvents::TERMINATE => 'renewCache' // ]; } public function renewCache($event): void { // 如果使用TERMINATE事件,参数对应为TerminateEvent,获取请求的逻辑保持一致 $request = $event instanceof ViewEvent ? $event->getRequest() : $event->getRequest(); $method = $request->getMethod(); // 原业务判断逻辑保持不变 if ($event instanceof ViewEvent) { $contact = $event->getControllerResult(); if (!$contact instanceof Contact && $method === Request::METHOD_GET) { return; } } // 清空整个contactsCache缓存池 if ($this->contactsCache instanceof ClearableCacheInterface) { $this->contactsCache->clear(); } } }
注意事项
clear()方法只会清空你注入的contactsCache对应缓存池的所有数据,不会影响其他缓存池的内容,完全匹配你的需求- 若使用TERMINATE事件方案,清空操作会在响应已经发送给客户端之后执行,不会拖慢用户的请求响应速度
- memcached驱动的
clear()操作为原子性实现,不会导致中间状态的读写异常
内容的提问来源于stack exchange,提问作者Daumis
相关产品推荐
相关产品推荐

