Fi1osof 30 июня 2013 2 0
В данном топике рассмотрим различные примеры вызова сниппетов, и как это сказывается на кешировании.

Для начала сразу уточним, что есть два метода вызова сниппетов:
1. Прописать MODX-тег, типа [[snippet]] — кешируемый сниппет, или [[!snippet]] — некешируемый сниппет.
2. Вызвать выполнение сниппета через API MODX, то есть $modx->runSnippet('snippet');

Теперь рассмотрим, в чем здесь разница и как это влияет на кеширование.

Принципиально именно в процессе выполнения сниппетов программно, или на уровне синтаксиса, разницы нет. Это именно если говорить про выполнение кода сниппета, и если не брать во внимание кеширование и выполнение кешированных элементов.
Если же говорить про кеширование, то сразу забегая вперед, скажу, что разница есть, если мы хотим кешировать результат, так как метод $modx->runSnippet() — это операция без учета кеша, то есть результат вызываемого таким образом сниппета всегда будет не из кеша, а реально выполняемый.

Но для того, чтобы правильно все это понимать, надо правильно понимать работу парсера и механизма кеширования MODX в целом. И главное, что здесь стоит уяснить, это то, что конечная обработка происходит только тогда, когда полностью сформирован документ, а не на уровне «когда парсер добрался до элемента, тогда его сразу и выполнил».

Объясню на примерах.

Для начала создадим два сниппета. snippet1
return $modx->runSnippet('snippet2');
и snippet2
return "<br />".time();
То есть при вызове первого сниппета, он будет вызывать второй сниппет и возвращать его результат, а snippet2 будет возвращать результат функции time(). Таким образом тогда, когда snippet2 будет возвращать некешированный результат, мы будем видеть актуальное время, а если результат будет кешированный, то при обновлении страницы время меняться не будет. Только не забудьте для тестовой страницы указать, что документ кешируемый, а то результат всегда будет некешированный.

Итак, сниппеты создали, теперь в контент документа пишем
[[snippet1]]
[[snippet2]]
. Сохраняем, и несколько раз обновляем страницу. Что мы видим? Каждый раз результат один и тот же, то есть оба сниппета возвращают кешированный результат.
1352834413
1352834413
(у вас будут другие цифры).

Почему так происходит? Ведь в сниппете snippet1 мы прописали вызов snippet2, и мы говорили о том, что это некешируемая операция.
Чтобы получить ответ, нам следует глянуть кеш страницы (кеш каждого документа находится в папке core/cache/resource/{context}(по умолчанию это web)/resources/).


И что мы там видим?
<?php  return array (
  'resourceClass' => 'modDocument',
  'resource' => 
  array (
    'id' => 1,
    'type' => 'document',
    ....................
    'content' => '[[snippet1]]
[[snippet2]]',

То есть контент этой страницы — два кешируемых сниппета.
Смотрим в этом же кеш-файле, что закешировано для этих сниппетов.
'elementCache' => 
  array (
    '[[*pagetitle]]' => 'Home',
    '[[snippet1]]' => '<br />1352834413',
    '[[snippet2]]' => '<br />1352834413',
  ),
То есть для этих сниппетов уже закеширован конечный результат, и этот результат будет выведен на страницу. И не зависимо от того, что snippet1 содержал в себе некешируемый вызов сниппета, сам сниппет snippet1 кешируемый, и его результат был закеширован. Как результат: при обновлении страницы мы видим одно и то же.

Теперь пропишем в контент это
[[!snippet1]]
[[snippet2]]
То есть теперь у нас snippet1 будет некешируемый.
Результат: при обновлении страницы в первой строке дата обновляется. Логично, так как у нас первый сниппет некешируемый.
Посмотрим кеш документа:
'elementCache' => 
  array (
    '[[*pagetitle]]' => 'Home',
    '[[snippet2]]' => '<br />1352835034',
  ),
Как видим, первый сниппет вообще не закешировался.

А теперь рассмотрим вот такой вариант:
1. Создадим новый сниппет snippet3 и пропишем в нем следующее:
return '[[!snippet2]]';
А в контент пропишем
[[snippet1]]
[[snippet2]]
[[snippet3]]
То есть все 3 сниппета кешируемые. При этом обновим несколько раз страницу, и что видим?: в третьей строчке результат обновляется. Почему? Смотрим кеш.
'elementCache' => 
  array (
    '[[*pagetitle]]' => 'Home',
    '[[snippet1]]' => '<br />1352835306',
    '[[snippet2]]' => '<br />1352835306',
    '[[snippet3]]' => '[[!snippet2]]',
  ),
То есть кеш-содержимое третьего сниппета — некешируемый сниппет snippet2. Потому на выходе каждый раз при обновлении страница повторно будет вызываться snippet2.

Завершим последним примером.
Создадим snippet4 и пропишем в него это:
$output = "<br />".time();
$output .= $modx->runSnippet('snippet2');
$output .= "[[!snippet2]]";
return $output;
А в контент пропишем только [[snippet4]], чтобы не городить вывод.
Обновляем несколько раз страницу, и видим, что только третья строка обновляется.
Что в кеше?
'elementCache' => 
  array (
    '[[*pagetitle]]' => 'Home',
    '[[snippet4]]' => '<br />1352835673<br />1352835673[[!snippet2]]',
  ),
То есть MODX-парсер закешировал все в кешируемом сниппете, кроме тега некешируемого сниппета.

Таким образом при создании всех своих шаблонов, чанков и т.п. думайте о том, что у вас в итоге попадет в кеш, так как использование большого числа некешируемых элементов внутри пусть даже и кешируемых элементов неизбежно приведет к увеличению нагрузки.
0 комментариев
Авторизуйтесь или зарегистрируйтесь (можно через соцсети ), чтобы оставлять комментарии.