簡體   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