Smarty缓存(带动态内容)

时间:2011-02-28 18:49:02

标签: php caching dynamic 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。
  4. 不幸的是每个都有问题:

    1. 似乎没有用?动态内容仍然会被缓存..
    2. 不确定如何实施或与(1)
    3. 有何不同
    4. 如何识别?有些页面具有相同的“名称”,但具体成员的内容不同......想想“myProfile.php”
    5. 有什么建议吗?谢谢!!

4 个答案:

答案 0 :(得分:4)

您可以使用反向代理(如Varnish)缓存页面的静态部分,并将动态内容包含在服务器端包含中(对于Varnishi,它是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压缩或缩小内容,如in the answer here所述

答案 1 :(得分: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);

答案 2 :(得分:0)

以3种方式你可以用这个名字保存缓存文件: myprofile_id,例如在用户表中注册并且他的id为455的persone,可以使用此名称保存缓存文件myprofile_455 之后你可以在tpl文件中包含缓存文件,如下所示:

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

答案 3 :(得分:0)

我知道这个问题已经过时了,我仍在提出一个帮助别人的解决方案。

我似乎遇到了与我正在开发的社交网站相同的问题。这是适合我的解决方案

  
      
  1. 似乎没有用?动态内容仍然会被缓存..
  2.   
  3. 不确定如何实施或与(1)
  4. 有何不同   

只需删除页面的静态部分,如页脚和标题,然后将它们放在不同的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);

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

希望这有帮助。