Товарищи, кто ковырял парсер, объясните пожалуйста в чём фишка.
document.parser.class.inc.php, первые строки функции outputContent()
$this->documentOutput= $this->documentContent;
// check for non-cached snippet output
if (strpos($this->documentOutput, '[!') > -1) {
$this->documentOutput= str_replace('[!', '[[', $this->documentOutput);
$this->documentOutput= str_replace('!]', ']]', $this->documentOutput);
// Parse document source
$this->documentOutput= $this->parseDocumentSource($this->documentOutput);
}
Из кода видно, что парсер заменяет некешируемые вызовы снипетов обычными — кешируемыми. И это прямо перед их обрабокой (вызвом parseDocumentSource()). Как это понимать правильно?
Для справки:
outputContent() вызывается через
prepareResponse() прямиком из
executeParser() (в самом конце). Т.е. это в процесе формировния выходного документа.
Предположил, что разгадка находится где-то в области процесса сохранения уже сгенерированной страницы в кэш, и загрузки её от туда. Т.е. только кеш генерируется по хитрому, а обрабатывается всё одинково. Но поверхностный осмнор ответственных за это функций, предположение не подтвердил, а дал поводу думать, что разница между вызовом [!некешируемый сниппет!] и [[кешируемый сниппет]] только в том, что за время генерации страницы некешируемый сниппет будет выполняться столько раз, сколько он взывается, а кешируемый — только одина раз – самый первый вызов. Но позже выяснилось, что в любом случае выполняться они будут каждый раз, когда их встретит парсер, а вот из базы повторно запрашиваться будут только некешируемые.
Спрашивается: зачем повтороно запрашивать сниппет из базы во время генерации страницы, когда он мог успеть измениться?
И всё таки, чувствую, недокопал я до конца. Ведь, при вкюченном кешировнии количество запросов к базе обычно равно нулю. Т.е. сниппеты всё таки от туда не берутся. А в каком тогда месте сохраняются результаты их работы? Если кто знает, неполенитесь, укажите пожалуйста место в коде.
P.S. MODx 0.9.5-6