1

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

SO中的答案有一条评论说:

你可以创建一个只更新这个缓存路由的命令。或者,如果您能承受性能影响,可以考虑使用内核事件侦听器,在每个请求上新注册路由。

我怎样才能只更新这个缓存路由?

4

2 回答 2

2

缓存的路由存储在哪里?

用于 url 匹配/生成的缓存类可以在中找到app/cache/environment并被调用appEnvironmentUrlGenerator.phpappEnvironmentUrlGenerator.php并且“环境”是dev, prod, .. 等之一。

API参考:

http://api.symfony.com/2.3/Symfony/Component/Routing/Matcher/UrlMatcher.html http://api.symfony.com/2.3/Symfony/Component/Routing/Generator/UrlGenerator.html

它是如何工作的?

路由器服务在构建时会接收一个 url-matcher 和一个 url-generator。然后在路由器的match()和方法中使用这些。generate()

https://github.com/symfony/symfony/blob/2.3/src/Symfony/Component/Routing/Router.php

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

于 2013-09-18T10:22:18.000 回答
2

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

没有简单的方法来更新路线(或更改路线)。

如果您检查CacheClearCommand,您会发现实现相当复杂。有人建议删除整个缓存目录,我不建议这样做,它很重并且会使您的网站挂起,直到重新生成缓存(即使您可以得到丢失文件的例外情况/如果会话保存在缓存文件夹)

如果缓存已委托,则调用 cache_warmer 预热无效。

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

            $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 类使用参数router.class定义, 请参见此处:https ://github.com/symfony/framework-bundle/blob/v2.8.2/Resources/config/routing.xml#L63

将这样的内容添加到您的 config.yml

参数:router.class:“My\Fancy\Router”

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

注意:我不确定您是否可以长期依赖它,如果您检查 master,定义已更改,参数不再存在:

https://github.com/symfony/framework-bundle/blob/master/Resources/config/routing.xml#L54

于 2016-01-28T10:50:21.510 回答