基于资源进行缓存

3.4 版本
维护中的版本

当所有配置资源(configuration resources)被加载后,你可能想要处理配置值,并把它们合并成一个文件。这个文件在使用时很像缓存。其内容毋须在每次程序运行时重新生成——只在配置资源发生改变时(才需要生成)。

例如,Symofny路由组件允许你加载所有路由,然后再基于它们剥离出一个URL matcher或是URL generator(文件)。本例中,当资源文件之一发生改变时(并且你正处于dev环境),那么已生成的文件将会失效并且再次生成。这可以通过使用ConfigCache类来完成。

下例向你展示了如何收集资源,然后基于这些资源来生成一些代码,最后把代码写入缓存。缓存也能接收“用于生成代码”的资源之集合。通过对比这些资源的“last modified”(上一次修改于)时间戳,缓存可以明确资源是否仍然fresh(新鲜),还是说资源内容必须要重新生成:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
use Symfony\Component\Config\ConfigCache;
use Symfony\Component\Config\Resource\FileResource;
 
$cachePath = __DIR__.'/cache/appUserMatcher.php';
 
// the second argument indicates whether or not you want to use debug mode
// 第二个参数指明你是否要使用debug模式
$userMatcherCache = new ConfigCache($cachePath, true);
 
if (!$userMatcherCache->isFresh()) {
    // fill this with an array of 'users.yml' file paths
    // 用一个类似'user.yml'的文件路径之数组来填充此变量
    $yamlUserFiles = ...;
 
    $resources = array();
 
    foreach ($yamlUserFiles as $yamlUserFile) {
        // see the previous article "Loading resources" to
        // see where $delegatingLoader comes from
        // 参考上一篇文章“加载资源”来了解$delegatingLoader来自哪里
        $delegatingLoader->load($yamlUserFile);
        $resources[] = new FileResource($yamlUserFile);
    }
 
    // the code for the UserMatcher is generated elsewhere
    // 用于UserMatcher的代码被生成到某个地方
    $code = ...;
 
    $userMatcherCache->write($code, $resources);
}
 
// you may want to require the cached code:
// 你可能需要这个缓存了的代码
require $cachePath;

在debug调试模式中,有个.meta文件将被创建到与缓存文件自身所在的相同目录中。这个.meta文件包含了序列化的资源,它们的时间戳被用于决定缓存是否新鲜。当不在调试模式时,缓存在创建之后即被认为是“新鲜的”,因此并没有.meta文件被生成。

本文,包括例程代码在内,采用的是 Creative Commons BY-SA 3.0 创作共用授权。

登录symfonychina 发表评论或留下问题(我们会尽量回复)