Кэширование скриптов при наличии include-файлов ?

При выполнении скриптов (сниппетов и плагинов) modx создаёт в папке cache/include/elements/ include-файлы в виде функций, содержащих код этих скриптов. Далее подключает эти файлы и вызывает содержащуюся в них функцию. Всё логично.
При включении в настройках modx кэширования скриптов (cache_scripts) modx дополнительно к include-файлам создаёт в папке cache/script/elements/ кэш-файлы с содержимым будущих include-файлов (т.е. содержимое кэш-файлов дублирует содержимое будущих include-файлов).

Логика работы modx при обработке скрипта (плагина или снипппета) при включенном кэшировании скриптов следующая (modscript.class.php):

1) Проверяется наличие include-файла
2) Если include-файл существует и актуален (при хранении скрипта во внешнем файле), то этот файл подключается и выполняется содержащаяся в нём функция
3) Если include-файл отсутствует или неактуален (при хранении скрипта во внешнем файле):
а) проверяется наличие кэш файла скрипта
б) если кэш-файл существует, modx получает его содержимое и помещает в include-файл (далее с созданным include-файлом выполняется п.2)
в) если кэш-файл отсутствует, он создаётся + это же содержимое помещается в include-файл (далее с созданным include-файлом выполняется п.2)

В этой логике непонятна роль кэш-файла скрипта, поскольку:
а) после очистки кэша modx (в т.ч. при сохранении любого элемента при включенной галке «Очистить кэш при сохранении») удаляются и кэш-файлы скриптов, и include-файлы скриптов.
б) при первой же обработке некоторого скрипта для него создаются и кэш-файл, и include-файл
г) при хранении кода скрипта во внешнем файле кэш-файл не участвует в проверке актуальности include-файла (modx сравнивает время изменения этого внешнего файла и include-файла)

Польза от кэш-файла скрипта может быть только в тех ситуациях, когда include-файл отсутствует, а кэш-файл существует — в этом случае код скрипта можно получить из кэш-файла (который может также храниться в оперативной памяти в зависимости от кэшера modx), минуя запрос к БД. Но такие ситуации исключены (если только не будут созданы искусственно).

Тогда какую роль выполнет кэш скриптов ?
По умолчанию кэширование скриптов в modx отключено. Может, это о чём-то говорит?

/**
* Loads and evaluates the script, returning the result.
*
* @return boolean True if the result of the script is not false.
*/
public function loadScript() {
    $includeFilename = $this->xpdo->getCachePath() . 'includes/' . $this->getScriptCacheKey() . '.include.cache.php';
    $result = is_readable($includeFilename);
    $outdated = false;
    $sourceFile = $this->getSourceFile();
    if ($this->isStatic() && $result && !empty($sourceFile) && is_readable($sourceFile)) {
        $includeMTime = filemtime($includeFilename);
        $sourceMTime = filemtime($sourceFile);
        $outdated = $sourceMTime > $includeMTime;
    }
    if (!$result || $outdated) {
        $script= false;
        if (!$outdated) {
            $script= $this->xpdo->cacheManager->get($this->getScriptCacheKey(), array(
                xPDO::OPT_CACHE_KEY => $this->xpdo->getOption('cache_scripts_key', null, 'scripts'),
                xPDO::OPT_CACHE_HANDLER => $this->xpdo->getOption('cache_scripts_handler', null, $this->xpdo->getOption(xPDO::OPT_CACHE_HANDLER)),
                xPDO::OPT_CACHE_FORMAT => (integer) $this->xpdo->getOption('cache_scripts_format', null, $this->xpdo->getOption(xPDO::OPT_CACHE_FORMAT, null, xPDOCacheManager::CACHE_PHP)),
            ));
        }
        if (!$script) {
            $script= $this->xpdo->cacheManager->generateScript($this);
        }
        if (!empty($script)) {
            $result = $this->xpdo->cacheManager->writeFile($includeFilename, "<?php\n" . $script);
        }
    }
    if ($result) {
        $result = include($includeFilename);
        if ($result) {
            $result = function_exists($this->getScriptName());
        }
    }
    return ($result !== false);
}
Cyrax_02
13 декабря 2014, 14:10
modx.pro
2 457
0

Комментарии: 1

Павел Голубев
31 января 2017, 18:36
0
Столкнулся с тем же вопросом. Зачем это делать, у кого-нибудь есть ответ?
    Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
    1