跳至内容

每个模板多个缓存

简介

对于单次对 display()fetch() 的调用,你可以使用多个缓存文件。

比方说对 $smarty->display('index.tpl') 的调用可能会根据某些条件产生多种不同的输出内容,且你希望为每个内容设置独立的缓存。你可以通过将 $cache_id 作为第二个参数传递至函数调用来实现此目的

<?php
use Smarty\Smarty;
$smarty = new Smarty;

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

$my_cache_id = (int) $_GET['article_id'];

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

上述中,我们将变量 $my_cache_id 作为 $cache_id 传递至 display()。对于每个唯一的 $my_cache_id 值,将为 index.tpl 生成一个独立的缓存。在此示例中, article_id 已在 URL 中传递,并用作 $cache_id

备注

在将值从客户端(网络浏览器)传递至 Smarty 或其他任何 PHP 应用程序时必须非常小心。虽然上述从 URL 中使用 article_id 的示例看起来很方便,但却可能造成严重的后果。$cache_id 用于在文件系统中创建一个目录,因此如果用户决定编写一个以非常快的速度发送随机 article_id 的脚本,这可能会在服务器层造成问题。务必在使用之前过滤传入的任何数据。在此示例中,你可能想要检查 article_id 在数据库中是否为有效 ID。

务必将相同的 $cache_id 作为第二个参数传递至 isCached()clearCache()

<?php
use Smarty\Smarty;
$smarty = new Smarty;

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

$my_cache_id = (int) $_GET['article_id'];

if (!$smarty->isCached('index.tpl', $my_cache_id)) {
    // ...
}

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

清除特定缓存

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

<?php
use Smarty\Smarty;
$smarty = new Smarty;

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

// clear all caches with "sports" as the $cache_id
$smarty->clearCache(null, 'sports');

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

通过给予它们相同的 $cache_id,你可以像这样“分组”你的缓存。

高级缓存分组

你可以通过设置 $cache_id 组来执行更详尽的分组。这是通过在 $cache_id 值中使用一根垂直线 | 来分离每个子组实现的。你可以根据需要创建任意多的子组。

  • 你可以将缓存组想象成一个目录层次结构。例如,缓存组 'a|b|c' 可以被视为目录结构 '/a/b/c/'

  • clearCache(null, 'a|b|c') 就好像删除文件 '/a/b/c/*'clearCache(null, 'a|b') 就好像删除文件 '/a/b/*'

  • 如果你指定一个模板名称,例如 clearCache('foo.tpl', 'a|b|c'),那么 Smarty 将尝试删除 '/a/b/c/foo.tpl'

  • 你无法删除多个缓存组下的一个指定的模板名称,例如 '/a/b/*/foo.tpl',缓存分组仅从左到右工作。你需要将模板分组到一个缓存组层次结构下才能将它们作为一个组来进行清除。

缓存分组不应当与其模板目录层次结构混淆,缓存分组不知道你的模板是如何组织的。因此,例如,如果你有一个像 themes/blue/index.tpl 这样的模板结构,并且你想要清除“蓝色”主题的所有缓存文件,你需要创建一个模仿你的模板文件结构的缓存组结构,例如 display('themes/blue/index.tpl', 'themes|blue'),然后使用 clearCache(null, 'themes|blue') 来清除它们。

<?php
use Smarty\Smarty;
$smarty = new Smarty;

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

// clear all caches with 'sports|basketball' as the first two cache_id groups
$smarty->clearCache(null, 'sports|basketball');

// clear all caches with "sports" as the first cache_id group. This would
// include "sports|basketball", or "sports|(anything)|(anything)|(anything)|..."
$smarty->clearCache(null, 'sports');

// clear the foo.tpl cache file with "sports|basketball" as the cache_id
$smarty->clearCache('foo.tpl', 'sports|basketball');

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