當前位置:首頁 » 文件管理 » smarty模板緩存

smarty模板緩存

發布時間: 2022-02-25 20:48:36

A. 如何清除 smarty 緩存

一、使用緩存
要開啟smarty的緩存,只需將caching設為true,並指定cache_dir即可.
使用cache_lefetime指定緩存生存時間,單位為秒
要對相同頁面生成多個不同的緩存,在display或fetch中加入第二參數cache_id,如$smarty->display('index.tpl',$my_cache_id);此特性可用於對不同的$_GET進行不同的緩存
二、清除緩存
clear_all_cache();//清除所有緩存
clear_cache('index.tpl');//清除index.tpl的緩存
clear_cache('index.tpl',cache_id);//清除指定id的緩存
三、使用自定義緩存方式
設置cache_handler_func使用自定義的函數處理緩存
如:
$smarty->cache_handler_func = "myCache";
function myCache($action, &$smarty_obj, &$cache_content, $tpl_file=null, $cache_id=null, $compile_id=null){
}
該函數的一般是根椐$action來判斷緩存當前操作:
switch($action){
case "read"://讀取緩存內容
case "write"://寫入緩存
case "clear"://清空
}
一般使用md5($tpl_file.$cache_id.$compile_id)作為唯一的cache_id
如果需要,可使用gzcompress和gzuncompress來壓縮解壓

四、局部關閉緩存
要在某些區域使緩存失效(只對需要的緩存),有幾種方法:
insert:
定義一個insert標簽要使用的處理函數,函數名格式為:insert_xx(array $params, object &$smarty)其中的xx是insert的name,也就是說,如果你定義的函數為insert_abc,則模板中使用方法為{insert name='abc'}
參數通過$params傳入
也可以做成insert插件,文件名命名為:insert.xx.php,函數命名為:smarty_insert_aa($params,&$smarty),xx定義同上
register_block:
定義一個block:smarty_block_name($params,$content, &$smarty){return $content;} //name表示區域名
注冊block:$smarty->register_block('name', 'smarty_block_name', false); //第三參數false表示該區域不被緩存
模板寫法:{name}內容{/name}
寫成block插件:
1)定義一件插件函數:block.cacheless.php,放在smarty的plugins目錄
block.cacheless.php的內容如下:
<?php
function smarty_block_cacheless($param, $content, &$smarty) {
return $content;
}
?>

2) 編寫程序及模板
示常式序:testCacheLess.php
<?php
include('Smarty.class.php');
$smarty = new Smarty;
$smarty->caching=true;
$smarty->cache_lifetime = 6;
$smarty->display('cache.tpl');
?>
所用的模板:cache.tpl
已經緩存的:{$smarty.now}<br>
{cacheless}
沒有緩存的:{$smarty.now}
{/cacheless}

B. smarty緩存疑惑

肯定要先解析PHP程序的,然後在PHP程序需要執行動態操作前,就執行是否存在緩存的判斷,假如存在,則直接讀取緩存內容,輸出,假如不存在才讀取資料庫,執行其他的模型操作。
比如,你有一個資料庫,裡面有一個新聞列表
假如,你沒有設置緩存,是不是每次訪問,都要訪問資料庫
如果設置了緩存,你在訪問頁面的時候,首先判斷是否存在緩存文件,如果存在直接讀取緩存內容,輸出。相比之下 ,你沒有任何其他的額外操作,是不是省了很多?

你這個沒用緩存啊~~倒!!!
用了緩存,緩存那部分是不用讀取資料庫了~~smarty的緩存可以達到變數級別的。

C. smarty緩存問題

所謂的緩存,其他就是生成了相應的靜態頁面,當有訪問請求時,直接訪問的是靜態頁面。如果互動的頁面,可以頁面部分緩存或者有新紀錄時清一下緩存

D. smarty模版頁面的不同請求被處理為同一個緩存文件而導致不同請求結果相同的解決方法

smarty 數據請求頁不做緩存,做了緩存沒有辦法提交不同數據

全局設置了緩存,那麼在請求頁獨立加入smarty 不緩存對象或函數

<?php
$smarty->debugging=false;
$smarty->caching=false;
?>

E. smarty 為什麼有的頁緩存不管用

smarty緩存控制

smarty提供了強大的緩存功能。但有時我們並不希望整篇文檔都被緩存,而是有選擇的緩存某一部分內容或某一部分內容不被緩存。例如你在頁面上端使用一個帶有廣告條位置的模板,廣告條可以包含任何HTML、圖象、FLASH等混合信息. 因此這里不能使用一個靜態的鏈接,同時我們也不希望該廣告條被緩存. 這就需要在 insert 函數指定,同時需要一個函數取廣告條的內容信息。smarty也提供了這種緩存控制能力。

我們可以使用{insert}使模板的一部分不被緩存
可以使用$smarty->register_function($params,&$smarty)阻止插件從緩存中輸出,
還可以使用$smarty->register_block($params,&$smarty)使整篇頁面中的某一塊不被緩存。

下面我們真對一個簡單需求,分別說明這三種控制緩存輸出的方法。

需求:被緩存的文檔中當前時間不被緩存,隨每次刷新而變化。

1、使用insert函數使模板的一部分不被緩存
index.tpl:
<div>{insert name="get_current_time"}</div>

index.php
function insert_get_current_time(){
return date("Y-m-d H:m:s");
}

$smarty=new smarty();
$smarty->caching = true;
if(!$smarty->is_cached()){
.......
}
$smarty->display('index.tpl');

註解:
定義一個函數,函數名格式為:inser_name(array $params, object &$smarty),
函數參數可選的,如果在模板的insert方法中需要加入其他屬性,就會作為數組傳遞給用戶定義的函數。
如:{insert name='get_current_time' local='zh'}
在get_current_time函數中我們就可以通過$params['local']來獲得屬性值。
如果在get_current_time函數中需要用到當前smarty對象的方法或屬性,就可以通過第二個參數獲得。

這時你會發現index.tpl已被緩存,但當前時間卻隨每次刷新在不斷變化。

2、使用register_function阻止插件從緩存中輸出
index.tpl:
<div>{current_time}{/div}

index.php:
function smarty_function_current_time($params, &$smarty){
return date("Y-m-d H:m:s");
}

$smarty=new smarty();
$smarty->caching = true;
$smarty->register_function('current_time','smarty_function_current_time',false);
if(!$smarty->is_cached()){
.......
}
$smarty->display('index.tpl');

註解:
定義一個函數,函數名格式為:smarty_type_name($params, &$smarty)
type為function
name為用戶自定義標簽名稱,在這里是{current_time}
兩個參數是必須的,即使在函數中沒有使用也要寫上。兩個參數的功能同上。

3、使用register_block使整篇頁面中的某一塊不被緩存
index.tpl:
<div align='center'>
Page created: {"0"|date_format:"%D %H:%M:%S"}

{dynamic}
Now is: {"0"|date_format:"%D %H:%M:%S"}
... do other stuff ...
{/dynamic}

</div>

index.php:
function smarty_block_dynamic($param, $content, &$smarty) {
return $content;
}
$smarty = new Smarty;
$smarty->caching = true;
$smarty->register_block('dynamic', 'smarty_block_dynamic', false);
if(!$smarty->is_cached()){
.......
}
$smarty->display('index.tpl');

註解:
定義一個函數,函數名格式為:smarty_type_name($params, &$smarty)
type為block
name為用戶自定義標簽名稱,在這里是{dynamic}
兩個參數是必須的,即使在函數中沒有使用也要寫上。兩個參數的功能同上。

4、總結
(1)對緩存的控制能力:
使用register_function和register_block能夠方便的控制插件輸出的緩沖能力,可以通過第三個參數控制是否緩存,默認是緩存的,需要我們顯示設置為false,正如我們試驗中的所做的那樣「$smarty->register_function('current_time','smarty_function_current_time',false);」
但insert函數默認是不緩存的。並且這個屬性不能修改。從這個意義上講insert函數對緩存的控制能力似乎不如register_function和register_block強。
(2)使用方便性:
但是insert函數使用非常方便。不用顯示注冊,只要在當前請求過程中包含這個函數smarty就會自動在當前請求的過程中查找指定的函數。
當然register_function也可以做到不在運行時顯示注冊。但是那樣做的效果跟其他模版函數一樣,統統被緩存,並且不能控制。
如果你使用在運行時顯示調用register_function注冊自定義函數,那麼一定要在調用is_cached()方法前完成函數的注冊工作。
否則在is_cached()這一步緩存文檔將因為找不到注冊函數而導致smarty錯誤。

F. 如何配置,使用和清除Smarty緩存

你用smarty的時候,模板裡面是不是用的它的標簽?smarty的編譯過程就是把模板拿過來,把裡面的標簽替換成相應php代碼,這就是smarty的編譯,就實質來講,你最終訪問的還是php文件,所以就效率上來說沒有提高也沒有降低smarty的緩存需要手動開啟,smarty的緩存就是把編譯好的文件執行後,同時生成一份靜態的html頁面,再次訪問的時候,你訪問的就是是html文件了,所以就效率來說,要高一些

G. php smarty模板緩存問題

既然這樣生成,肯定有地方通過一定的手段或者方法來生成的文件名。修改成時間截吧。

H. smarty緩存應用 有沒有smarty緩存的很詳細的教程之類的給發發 ,麻煩各位啦!

smarty是做模版用的。不是專門用來做緩存的。
這里講的很詳細:http://www.php100.com/manual/smarty/

I. smarty緩存如何使用

開啟smarty緩存,只需將caching設為true,並指定cache_dir即可.
使用cache_lefetime指定緩存生存時間,單位為秒
要對相同頁面生成多個不同的緩存,在display或fetch中加入第二參數cache_id,如$smarty->display('index.tpl',$my_cache_id);此特性可用於對不同的$_GET進行不同的緩存

注意
$smarty->caching = true;開啟的, 必須在建個cache文件夾存放緩存文件。。
3.0以上版,$smarty->setForce_compile(true); 早期版本,$smarty->force_compile = true;

J. smarty編譯和緩存的區別

smarty的目標是分離php和html代碼,然而,最終你的html中雖然沒有php了,但是卻多了很多smarty的代碼。因此smarty的模板在執行時需要先把samrty標記去掉,替換為正常的php代碼,為了避免每次都做這件事,smarty把替換的結果緩存為一個文件,下次就直接用編譯好的文件了,提高效率。

以上是samrty中的編譯和緩存機制。

而從廣義上講,緩存是將內容通過文件或駐留內存的方式保留數據,以便快速調用。

說實話我不覺得smarty(以及其他所有的模板方式)有任何的好處。雖然它節約了頁面開發人員學習php的時間,可是不是一樣要花時間學smarty嗎?而且增加了調試成本。
而且smarty就是基於PHP的偽碼,它能做的php都能做,php能做的它不一定行...雞肋啊

熱點內容
ios9照片加密 發布:2024-10-27 22:18:29 瀏覽:49
pythonyaml安裝 發布:2024-10-27 22:06:32 瀏覽:585
php5升級到php7 發布:2024-10-27 21:46:06 瀏覽:737
安卓機都在哪裡下載游戲 發布:2024-10-27 21:23:57 瀏覽:646
伺服器里的視頻怎麼做成鏈接 發布:2024-10-27 21:23:19 瀏覽:381
資料庫還原出錯 發布:2024-10-27 21:23:14 瀏覽:377
怎麼看出手錶的配置 發布:2024-10-27 21:23:07 瀏覽:162
車機不是安卓系統如何使用carplay 發布:2024-10-27 21:23:07 瀏覽:675
愛加密價值 發布:2024-10-27 21:23:01 瀏覽:79
vs2017編譯技巧 發布:2024-10-27 21:01:14 瀏覽:50