繁体   English   中英

Smarty缓存(带动态内容)

[英]Smarty Caching (With Dynamic Content)

我有一个非常动态(社交网络)网站运行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”

有什么建议? 谢谢!!

您可以使用反向代理(如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是生成动态内容的脚本。

对于清漆: 请注意使用ESI的gzipped或缩小内容,如此答案中所述

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

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);

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

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

  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);

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

希望这可以帮助。

在3种方式你可以通过这个名称保存缓存文件:myprofile_id例如注册的persone和他在用户表中的id为455你可以为他保存缓存文件myprofile_455之后你可以在tpl文件中包含缓存文件,就像这样:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM