Кеширование, основанное на источниках

Дата обновления перевода 2024-06-24

Кеширование, основанное на источниках

После загрузки всех источников конфигурации, вам может захотеться обработать значения конфигурации и объединить их все в один файл. Этот файл действует как кеш. Его содержание не должно регенерироваться каждый раз при запуске приложения, только при изменении источников конфигурации.

Например, компонент Symfony Routing позволяет вам загружать все маршруты, а потом сбрасывать сопоставитель URL или генератор URL, основываясь на этих маршрутах. В этом случае, когда один из ресурсов изменяется (а вы работаете в окружении разработки), сгенерированный файл должен быть инвалидирован и сгенерирован повторно. Этого можно достичь, используя класс ConfigCache.

Пример ниже показывает вам, как собирать источники, потом генерировать некоторый код, основанный на источниках, которые были загружены, и как записать этот код в кеш. Кеш также получает коллекцию источников, которые были использованы для генерирования кода. Посмотрев на временную отметку "последние изменения" этих источников, кеш может решить, являются ли они свежими, или содержание стоит сгенерировать повторно:

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';

// второй аргумент указывает хотите ли вы использовать режим отладки
$userMatcherCache = new ConfigCache($cachePath, true);

if (!$userMatcherCache->isFresh()) {
    // заполните это массивом путей файла 'users.yaml'
    $yamlUserFiles = ...;

    $resources = [];

    foreach ($yamlUserFiles as $yamlUserFile) {
        // см. статью "Загрузка источников", чтобы
        // узнать, откуда $delegatingLoader
        $delegatingLoader->load($yamlUserFile);
        $resources[] = new FileResource($yamlUserFile);
    }

    // код для UserMatcher генерируется где-то в другом месте
    $code = ...;

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

// вы можете захотеть потребовать кешированный код:
require $cachePath;

В режиме отладки файл .meta будет создан в том же каталоге, что и сам файл кеша. Этот файл .meta содержит сериализованные источники, временные отметки которых используются для определения свежести кеша. В других режима кеш считается "свежим" с момента своего существования, соответственно, файл .meta не создаётся.

Вы можете явно указать абсолютный путь к метафайлу:

1
2
3
4
5
6
7
use Symfony\Component\Config\ConfigCache;
use Symfony\Component\Config\Resource\FileResource;

$cachePath = __DIR__.'/cache/appUserMatcher.php';

// третий необязательный аргумент указывает абсолютный путь к метафайлу
$userMatcherCache = new ConfigCache($cachePath, true, '/my/absolute/path/to/cache.meta');

7.1

Аргумент для настройки пути к метафайлу был представлен в Symfony 7.1.