1. 程式人生 > >php,smarty 快取操作

php,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來壓縮和解壓
四、區域性關閉快取

要在某些區域使快取失效(只對需要的快取),有幾種方法:
inser:
定義一個inser標籤要使用的處理函式,函式名格式為: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}


關於模板中部分不被快取的解決辦法:

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

我們可以使用{insert}使模板的一部分不被快取

可以使用$smarty->register_function($params,&$smarty)阻止外掛從快取中輸出,

還可以使用$smarty->register_block($params,&$smarty)使整篇頁面中的某一塊不被快取。

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

需求:被快取的文件中當前時間不被快取,隨每次重新整理而變化。

1、使用insert函式使模板的一部分不被快取

index.tpl:


{insert name="get_current_time"}


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:


{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}

兩個引數是必須的,即使在函式中沒有使用也要寫上。兩個引數的功能同上。