Caching 如何更新特定的缓存路由?

Caching 如何更新特定的缓存路由?,caching,symfony,url-routing,Caching,Symfony,Url Routing,我正在运行一个Symfony2应用程序,我有一个关于缓存的问题 这里有一句话是这样说的: 您可以创建一个仅更新此缓存路由的命令。或 也许考虑使用一个新注册的内核事件侦听器 如果您能够承受性能影响,请根据每个请求进行路由 如何仅更新这一条缓存路由?缓存路由存储在哪里? url匹配/生成的缓存类可以在app/cache/environment中找到,它们被称为appEnvironmentUrlGenerator.php和appEnvironmentUrlGenerator.php,其中“enviro

我正在运行一个Symfony2应用程序,我有一个关于缓存的问题

这里有一句话是这样说的:

您可以创建一个仅更新此缓存路由的命令。或 也许考虑使用一个新注册的内核事件侦听器 如果您能够承受性能影响,请根据每个请求进行路由


如何仅更新这一条缓存路由?

缓存路由存储在哪里?

url匹配/生成的缓存类可以在
app/cache/environment
中找到,它们被称为
appEnvironmentUrlGenerator.php
appEnvironmentUrlGenerator.php
,其中“environment”是
dev
prod
。。等等

API参考:

它是如何工作的?

路由器服务在构造时接收url匹配器和url生成器。然后在路由器的
match()
generate()
方法中使用这些方法


为了预热缓存,使用路由器的
warmUp()
方法(如果实现)。

缓存路由存储在哪里?

url匹配/生成的缓存类可以在
app/cache/environment
中找到,它们被称为
appEnvironmentUrlGenerator.php
appEnvironmentUrlGenerator.php
,其中“environment”是
dev
prod
。。等等

API参考:

它是如何工作的?

路由器服务在构造时接收url匹配器和url生成器。然后在路由器的
match()
generate()
方法中使用这些方法


为了预热缓存,使用路由器的
warmUp()
方法(如果实现)。

nifr编写的所有内容都是正确的,但并不能真正帮助您。
Symfony的内置路由器旨在支持“静态”路由,因此在第一次缓存预热时,将生成并缓存路由。如果检查提到的缓存文件,您将看到路由保存在一个静态私有变量中

没有简单的方法可以更新路线(或更改路线)

  • 使用Symfony2 CMF 对于您的简单问题,这是一个有点复杂的解决方案:

  • 正在清除(使缓存无效)

如果您检查,您将看到实现非常复杂。有些人建议删除整个缓存目录,我不建议这样做,因为它相当繁重,会使您的站点一直挂起,直到重新生成缓存为止(如果会话保存在缓存文件夹下,您甚至可以获得丢失文件/和注销用户的例外)

如果缓存已委派,则调用缓存预热没有任何效果

如果您只是删除两个相关的缓存文件,然后在路由器上调用预热,将是一个更好的解决方案,但也不是很好的解决方案

            $cacheDir = $this->container->getParameter("kernel.cache_dir");
            // Delete routing cache files
            $filesystem   = $this->container->get('filesystem');
            $finder = new Finder();
            /** @var File $file */
            foreach ($finder->files()->depth('== 0')->in($cacheDir) as $file) {
                if (preg_match('/UrlGenerator|UrlMatcher/', $file->getFilename()) == 1) {
                    $filesystem->remove($file->getRealpath());
                }
            }
            $router = $this->container->get('router');
            $router->warmUp($cacheDir);
  • 重写默认路由器类
从2.8开始,路由器类使用参数Router.class 请看这里:

在config.yml中添加类似的内容

参数: router.class:“我的\幻想\路由器”

您可以实现自己的路由器类,扩展原始路由器,还需要扩展UrlMatcher和UrlGenerator类来调用父实现,并添加自己的路由以匹配/生成。这样,您就不需要刷新缓存,因为您可以动态添加路由

注意:我不确定您是否可以长期依赖此功能,如果您选中master,则定义已更改,参数不再存在:


nifr所写的一切都是真实的,但并不能真正帮助你。
Symfony的内置路由器旨在支持“静态”路由,因此在第一次缓存预热时,将生成并缓存路由。如果检查提到的缓存文件,您将看到路由保存在一个静态私有变量中

没有简单的方法可以更新路线(或更改路线)

  • 使用Symfony2 CMF 对于您的简单问题,这是一个有点复杂的解决方案:

  • 正在清除(使缓存无效)

如果您检查,您将看到实现非常复杂。有些人建议删除整个缓存目录,我不建议这样做,因为它相当繁重,会使您的站点一直挂起,直到重新生成缓存为止(如果会话保存在缓存文件夹下,您甚至可以获得丢失文件/和注销用户的例外)

如果缓存已委派,则调用缓存预热没有任何效果

如果您只是删除两个相关的缓存文件,然后在路由器上调用预热,将是一个更好的解决方案,但也不是很好的解决方案

            $cacheDir = $this->container->getParameter("kernel.cache_dir");
            // Delete routing cache files
            $filesystem   = $this->container->get('filesystem');
            $finder = new Finder();
            /** @var File $file */
            foreach ($finder->files()->depth('== 0')->in($cacheDir) as $file) {
                if (preg_match('/UrlGenerator|UrlMatcher/', $file->getFilename()) == 1) {
                    $filesystem->remove($file->getRealpath());
                }
            }
            $router = $this->container->get('router');
            $router->warmUp($cacheDir);
  • 重写默认路由器类
从2.8开始,路由器类使用参数Router.class 请看这里:

在config.yml中添加类似的内容

参数: router.class:“我的\幻想\路由器”

您可以实现自己的路由器类,扩展原始路由器,还需要扩展UrlMatcher和UrlGenerator类来调用父实现,并添加自己的路由以匹配/生成。这样,您就不需要刷新缓存,因为您可以动态添加路由

注意:我不确定您是否可以长期依赖此功能,如果您选中master,则定义已更改,参数不再存在:


要求类似的东西。我会尽力提供一些有用的信息。要求类似的东西。我会尽力提供一些有用的信息。好吧,这对我的问题来说似乎太复杂了。因此,我将检查我的错误是否再次发生。如果是的话,我想我会简单地修改我的代码,这样我就可以省略这个变通方法。好吧,这对我的工作来说似乎太复杂了