Smarty缓存(与动态内容一起)

3
我有一个运行smarty的非常动态(社交网络)站点,我希望启用缓存。
我的结构: index.php 显示() template.tpl template.tpl 包括() indexContent.tpl
大部分 template.tpl 中的内容是静态的..例如脚本、横幅、页脚等。 我该如何对这些内容进行缓存,但不包括某些因登录用户而异的特定部分?
我发现了三种方法:
1. {nocache} {include='indexContent.tpl'} {nocache} 2. {dynamic} {include ... 3. 为每个页面设置cache_id。
不幸的是,每种方法都有问题: 1. 不起作用?动态内容仍然被缓存。 2. 不确定如何实现或与 (1) 有何区别。 3. 如何唯一识别?某些页面具有相同的“名称”,但对于特定成员的内容不同... 比如 "myProfile.php"。
有什么建议吗?谢谢!!

它被缓存在哪里?你是使用APC进行缓存还是Memcached? - Rahul Prasad
我正在尝试使用Smarty来创建缓存。 - pws5068
4个回答

4
你可以使用反向代理,例如Varnish来缓存页面的静态部分,并将动态内容作为服务器端包含(对于Varnish,它是ESI)。接下来,您需要设置静态和动态URL的缓存规则,以便静态URL将被缓存很长一段时间,而动态URL将不会被缓存。
为了更容易理解整个想法,以下是您的页面HTML代码可能看起来像什么:
<html>
<head>...</head>
<body>
    ...some static layout...
    <esi:include src="/esi/indexContent.php"/>
    ...some another static layout...
</body>
</html>

/esi/indexContent.php是生成动态内容的脚本。

对于Varnish: 注意使用ESI时的gzip或deflate内容,如这里的答案所述


这不是我熟悉的东西。我明天会试验一下。谢谢。 - pws5068

1
我们有相同的情况。我们整个前端页面都被缓存,除了一些动态元素(新闻、最新论坛帖子)之外,我发现绕过这个问题最简单的方法是在缓存模板中添加一个关键字。

NEWS_BLOCK

在你的逻辑脚本中,你可以加载你的新闻模板并用 preg_replace 函数替换关键字。
$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

我知道这个问题很老了,但我仍然提供一个解决方案来帮助其他人。

我似乎遇到了一个正在开发的社交网络网站的同样麻烦。以下是对我有用的解决方案:

  1. 看起来并没有起作用?动态内容仍然被缓存了...
  2. 不确定如何实施或与 (1) 有何区别

只需删除页面的静态部分(如页脚和页眉)并将它们放在不同的 tpl 文件中。然后将 tpl 文件包含为

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

或者相反,将页面的动态部分移除并放入另一个模板中,然后作为包含文件引用。

{include file='head.html' nocache}

3. 如何唯一地识别?对于特定成员,某些页面具有相同的“名称”但不同的内容…例如“myProfile.php”。
针对类似个人资料页这样的同一页面但内容不同的情况,您可以将个人资料ID作为参数传递给缓存调用。
$my_cache_id = $_GET['profile_id'];    
$smarty->display('index.tpl', $my_cache_id);

这将确保不同参数的同一页面不被视为同一页面。

希望这有所帮助。


0

有三种方式可以通过以下名称保存缓存文件: 例如,一个在用户表中注册并且其ID为455的人,您可以使用此名称myprofile_455保存他的缓存文件。 之后,您可以像这样在tpl文件中包含缓存文件:

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

问题在于我只想缓存模板数据。如果我缓存用户455的“个人资料”页面,而发生新评论、事件、私信或其他杂项更新,则不会显示。 - pws5068
你可以缓存静态部分,然后为包含文件创建多个缓存文件,动态部分可以以常规方式显示(分配给变量),我们的问题是什么? - afsane
我几乎需要它的相反之处...大多数{include}中的内容都是完全动态的。 我显示()的主要模板有90%是静态的。 - pws5068
哇,我无法理解你的问题!你可以将静态代码放在包含文件中(90%),而其他部分(动态部分)将显示变量!!你可以反转它,没有问题!!例如:{include file="cache/header_myprofile'$smarty.get.userid'.html"}{$Name} {include file="cache/footer_myprofile'$smarty.get.userid'.html"} - afsane

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接