Smarty Caching (с динамическим контентом) - PullRequest
3 голосов
/ 28 февраля 2011

У меня очень динамичный сайт (в социальных сетях), на котором запущен smarty, для которого я хочу включить кэширование.

Моя структура: index.php display () s template.tpl template.tpl include () s indexContent.tpl

Большинство содержимого в template.tpl является статическим, например скрипты, баннер, нижний колонтитул и т. д. Как я могу кешировать это, но не отдельные части, которые выглядят по-разномув зависимости от того, кто вошел в систему (среди прочих факторов)?

Я обнаружил 3 метода:

  1. {nocache} {include='indexContent.tpl'} {nocache}
  2. {dynamic} {include ...
  3. Установите cache_id для каждой страницы.

К сожалению, у каждого есть проблема:

  1. Не похоже, что он работает?Динамический контент по-прежнему кэшируется ..
  2. Не знаете, как реализовать или чем он отличается от (1)
  3. Как определить уникально?Некоторые страницы имеют одно и то же «имя», но разное содержание для конкретных участников ... подумайте «myProfile.php»

Есть предложения?Спасибо!!

Ответы [ 4 ]

4 голосов
/ 07 апреля 2011

Вы можете использовать обратный прокси-сервер, например Varnish, для кэширования статической части страницы и включения динамического содержимого в качестве серверных включений (для Varnishi это ESI ). Затем вам нужно будет настроить правила кэширования для ваших статических и динамических URL-адресов, чтобы статический был кэшироваться в течение длительного периода времени, в то время как динамический не кэшировался вообще.

Чтобы было проще понять всю идею, вот как может выглядеть HTML-код вашей страницы:

<html>
<head>...</head>
<body>
    ...some static layout...
    <esi:include src="/esi/indexContent.php"/>
    ...some another static layout...
</body>
</html>

Где /esi/indexContent.php - это скрипт, который генерирует динамический контент.

Для лака: Остерегайтесь сжатого или дефлированного контента с ESI, как описано в ответе здесь

1 голос
/ 12 апреля 2011

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

NEWS_BLOCK

в вашем логическом скрипте вы затем загружаете свой шаблон новостей и предварительно заменяете его ключевым словом.

$news_template = $smarty->fetch('news_template.smrt');
$page_body_raw = $smarty->fetch('frontpage.smrt');
$page_body = preg_replace('/NEWS_BLOCK/', $news_template, $page_body_raw);
0 голосов
/ 04 августа 2012

Я знаю, что вопрос старый, я все еще предлагаю решение, чтобы помочь кому-то еще.

Кажется, у меня такие же проблемы с сайтом социальной сети, который я разрабатываю. Вот решение, которое сработало для меня

  1. Не похоже, что он работает? Динамический контент все еще кэшируется ..
  2. Не уверен, как реализовать или чем он отличается от (1)

Просто удалите статическую часть вашей страницы, такую ​​как нижний колонтитул и верхний колонтитул, и поместите их в другой файл TPL. Затем включите файл TPL как

{include file='head.html' cache_lifetime=5000}

или наоборот удалите динамическую часть вашей страницы, поместите ее в другой шаблон и включите в нее как

{include file='head.html' nocache}

3.Как идентифицировать уникально? Некоторые страницы имеют одно и то же «имя», но разное содержание для конкретных участников ... подумайте «myProfile.php»

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

$my_cache_id = $_GET['profile_id'];    
$smarty->display('index.tpl', $my_cache_id);

Это гарантирует, что одна и та же страница с разными параметрами не будет обрабатываться как одна и та же страница.

Надеюсь, это поможет.

0 голосов
/ 07 апреля 2011

3-х способов: вы можете сохранить файл кэша под этим именем: myprofile_id, например, зарегистрированное лицо и его идентификатор 455 в пользовательской таблице. Вы можете сохранить файл кэша для него с таким именем myprofile_455, после чего вы можете включить кэшированный файл в tpl.такой файл:

{include file="cache/myprofile`$smarty.get.userid`.html"}
...