我正在运行一个 Symfony2 应用程序,我有一个关于缓存的问题。
SO中的答案有一条评论说:
你可以创建一个只更新这个缓存路由的命令。或者,如果您能承受性能影响,可以考虑使用内核事件侦听器,在每个请求上新注册路由。
我怎样才能只更新这个缓存路由?
我正在运行一个 Symfony2 应用程序,我有一个关于缓存的问题。
SO中的答案有一条评论说:
你可以创建一个只更新这个缓存路由的命令。或者,如果您能承受性能影响,可以考虑使用内核事件侦听器,在每个请求上新注册路由。
我怎样才能只更新这个缓存路由?
缓存的路由存储在哪里?
用于 url 匹配/生成的缓存类可以在中找到app/cache/environment
并被调用appEnvironmentUrlGenerator.php
,appEnvironmentUrlGenerator.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)。
nifr 所写的一切都是真实的,但并不能真正帮助您。
Symfony 的内置路由器旨在支持“静态”路由,因此在第一次缓存预热时,将生成并缓存路由。如果您检查提到的缓存文件,您将看到路由保存在静态私有变量中。
没有简单的方法来更新路线(或更改路线)。
使用 Symfony2 CMF 对于您的简单问题,这有点复杂:http: //symfony.com/doc/master/cmf/index.html
清除(无效)缓存
如果您检查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