Кэширование скриптов при наличии 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 отключено. Может, это о чём-то говорит?
При включении в настройках 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);
}
Комментарии: 1
Столкнулся с тем же вопросом. Зачем это делать, у кого-нибудь есть ответ?
Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.