You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.05 09:06:03