Caching based on Resources

When all configuration resources are loaded, you may want to process the configuration values and combine them all in one file. This file acts like a cache. Its contents don’t have to be regenerated every time the application runs – only when the configuration resources are modified.

すべての構成リソースがロードされたら、構成値を処理して、それらすべてを 1 つのファイルに結合することができます。このファイルはキャッシュのように機能します。その内容は、アプリケーションが実行されるたびに再生成する必要はありません。構成リソースが変更された場合のみです。

For example, the Symfony Routing component allows you to load all routes, and then dump a URL matcher or a URL generator based on these routes. In this case, when one of the resources is modified (and you are working in a development environment), the generated file should be invalidated and regenerated. This can be accomplished by making use of the ConfigCache class.

たとえば、Symfony ルーティング コンポーネントを使用すると、すべてのルートをロードしてから、これらのルートに基づいて URL マッチャーまたは URL ジェネレーターをダンプできます。この場合、リソースの 1 つが変更されると (開発環境で作業している場合)、生成されたファイルを無効にして再生成する必要があります。これは、ConfigCache クラスを利用することで実現できます。

The example below shows you how to collect resources, then generate some code based on the resources that were loaded and write this code to the cache. The cache also receives the collection of resources that were used for generating the code. By looking at the "last modified" timestamp of these resources, the cache can tell if it is still fresh or that its contents should be regenerated:

以下の例は、リソースを収集し、読み込まれたリソースに基づいてコードを生成し、このコードをキャッシュに書き込む方法を示しています。キャッシュは、コードの生成に使用されたリソースのコレクションも受け取ります。これらのリソースの「最後に変更された」タイムスタンプを確認することで、キャッシュはそれがまだ新しいかどうか、またはそのコンテンツを再生成する必要があるかどうかを判断できます。
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
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
$userMatcherCache = new ConfigCache($cachePath, true);

if (!$userMatcherCache->isFresh()) {
    // fill this with an array of 'users.yaml' file paths
    $yamlUserFiles = ...;

    $resources = [];

    foreach ($yamlUserFiles as $yamlUserFile) {
        // see the article "Loading resources" to
        // know where $delegatingLoader comes from
        $delegatingLoader->load($yamlUserFile);
        $resources[] = new FileResource($yamlUserFile);
    }

    // the code for the UserMatcher is generated elsewhere
    $code = ...;

    $userMatcherCache->write($code, $resources);
}

// you may want to require the cached code:
require $cachePath;

In debug mode, a .meta file will be created in the same directory as the cache file itself. This .meta file contains the serialized resources, whose timestamps are used to determine if the cache is still fresh. When not in debug mode, the cache is considered to be "fresh" as soon as it exists, and therefore no .meta file will be generated.

デバッグ モードでは、キャッシュ ファイル自体と同じディレクトリに .meta ファイルが作成されます。この .meta ファイルにはシリアル化されたリソースが含まれており、そのタイムスタンプを使用してキャッシュがまだ新しいかどうかを判断します。デバッグ モードでない場合、キャッシュは存在するとすぐに「新しい」と見なされるため、.meta ファイルは生成されません。