Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/jsf/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php Smarty缓存(具有动态内容)_Php_Caching_Dynamic_Smarty - Fatal编程技术网

Php Smarty缓存(具有动态内容)

Php Smarty缓存(具有动态内容),php,caching,dynamic,smarty,Php,Caching,Dynamic,Smarty,我有一个运行smarty的非常动态的(社交网络)网站,我想为它启用缓存 我的结构: index.php display()s template.tpl template.tpl include()s indexContent.tpl template.tpl中的大部分内容是静态的。。例如脚本、横幅、页脚。。等等。我如何缓存那些但不是特定的部分,这些部分看起来不同,取决于谁登录(以及其他因素) 我发现了3种方法: {nocache}{include='indexContent.tpl'}{noca

我有一个运行smarty的非常动态的(社交网络)网站,我想为它启用缓存

我的结构: index.php display()s template.tpl template.tpl include()s indexContent.tpl

template.tpl中的大部分内容是静态的。。例如脚本、横幅、页脚。。等等。我如何缓存那些但不是特定的部分,这些部分看起来不同,取决于谁登录(以及其他因素)

我发现了3种方法:

  • {nocache}{include='indexContent.tpl'}{nocache}
  • {dynamic}{include…
  • 设置每个页面的缓存id
  • 不幸的是,每个人都有一个问题:

  • 似乎真的不起作用?动态内容仍然会被缓存
  • 不确定如何实施或与(1)有何不同
  • 如何唯一地识别?某些页面具有相同的“名称”,但特定成员的内容不同…想想“myProfile.php”

  • 有什么建议吗?谢谢!!

    通过3种方式,您可以使用以下名称保存缓存文件: myprofile_id例如,在用户表u中注册且其id为455的人员可以使用此名称myprofile_455为其保存缓存文件 之后,您可以在tpl文件中包含缓存文件,如下所示:

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

    您可以使用反向代理(如Varnish)缓存页面的静态部分,并将动态内容包括在服务器端(Varnishi就是这样)。接下来,您需要为静态和动态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:注意使用ESIs压缩或压缩的内容,正如所描述的那样

    我们有相同的场景。除了几个动态元素(新闻、最新论坛线程)之外,我们的整个首页都被缓存,我发现最简单的方法就是在缓存的模板中添加一个关键字

    新闻组

    然后在逻辑脚本上加载新闻模板,并用关键字替换它

    $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)有何不同
  • 只需删除页面的静态部分,如页脚和页眉,并将它们放在不同的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);
    
    这将确保具有不同参数的同一页面不会被视为同一页面


    希望这有帮助。

    缓存在哪里?您是使用APC进行缓存还是使用Memcached?我正在尝试使用smarty创建缓存问题是我只想缓存模板数据。如果我缓存用户455的“配置文件”页面和一个新的评论、事件、私人消息或其他杂项更新发生时,它将不可见,所以你可以缓存静态部分,然后你有几个缓存文件用于包含,动态部分可以以常规方式显示(分配给变量)我们的问题是什么?!我几乎需要相反的情况。{include}中的大部分内容s是完全动态的。我显示的主模板()是90%静态的。哇,我不能理解你的问题!你可以将静态代码放在包含文件(90%)中,其他部分(动态部分)将用变量显示!!你可以反转它,没有问题!!例如:{include file=“cache/header\u myprofile”$smarty.get.userid.html“{$Name}{include file=“cache/footer\u myprofile'$smarty.get.userid.html”}`这不是我熟悉的东西。我明天会尝试一下。谢谢