Skip to content

每页多个缓存 {/programmers/caching/caching-multiple-caches/}

你可以对 display()fetch() 的单次调用有多个缓存文件。假设 display('index.tpl') 的调用可能会根据某些条件有多种不同的输出内容,你希望为每一个都有单独的缓存。你可以通过将 $cache_id 作为函数调用的第二个参数来实现这一点。

<?php
require('Smarty.class.php');
$smarty = new Smarty;

$smarty->setCaching(Smarty::CACHING_LIFETIME_CURRENT);

$my_cache_id = $_GET['article_id'];

$smarty->display('index.tpl', $my_cache_id);
?>

上面,我们将变量 $my_cache_id 传递给 display() 作为 $cache_id。对于每一个 $my_cache_id 的唯一值,都会为 index.tpl 生成一个独立的缓存。在这个例子中,article_id 是从 URL 中传递的,并被用作 $cache_id

注意

当将值从客户端(web 浏览器)传入 Smarty 或任何 PHP 应用时,要非常小心。尽管从 URL 中使用 article_id 的上述例子看起来很方便,但可能会有不好的后果。$cache_id 用于在文件系统上创建一个目录,所以如果用户决定传入一个非常大的 article_id 值,或者编写一个脚本以快速的速度发送随机的 article_id,这可能会在服务器级别引起问题。确保在使用之前清理任何传入的数据。在这种情况下,也许你知道 article_id 的长度为十个字符,只由字母和数字组成,并且必须是数据库中的有效 article_id。要检查这一点!

确保将相同的 $cache_id 作为第二个参数传递给 isCached()clearCache()

<?php
require('Smarty.class.php');
$smarty = new Smarty;

$smarty->setCaching(Smarty::CACHING_LIFETIME_CURRENT);

$my_cache_id = $_GET['article_id'];

if(!$smarty->isCached('index.tpl',$my_cache_id)) {
    // 没有可用的缓存,此处进行变量分配。
    $contents = get_database_contents();
    $smarty->assign($contents);
}

$smarty->display('index.tpl',$my_cache_id);
?>

你可以通过将 NULL 作为 clearCache() 的第一个参数传递,清除特定 $cache_id 的所有缓存。

<?php
require('Smarty.class.php');
$smarty = new Smarty;

$smarty->setCaching(Smarty::CACHING_LIFETIME_CURRENT);

// 清除所有带有 "sports" 的 $cache_id 的缓存
$smarty->clearCache(null,'sports');

$smarty->display('index.tpl','sports');
?>

通过这种方式,你可以通过给它们分配相同的 $cache_id 来将你的缓存“分组”在一起。