让我们假设我有一个像这样的代码......
if (!$data = $cache->load("part1_cache_id")) {
$item_id = $model->getItemId();
ob_start();
echo 'Here is the cached item id: '.$item_id;
$data = ob_get_contents();
ob_end_clean();
$cache->save($data, "part1_cache_id");
}
echo $data;
echo never_cache_function($item_id);
if (!$data_2 = $cache->load("part2_cache_id")) {
ob_start();
echo 'Here is the another cached part of the page...';
$data_2 = ob_get_contents();
ob_end_clean();
$cache->save("part2_cache_id");
}
echo $data_2;
据我所知,我需要将$ item_id变量传递给never_cache_function,但如果第一部分被缓存(part1_cache_id),那么我无法获得$ item_id值。我看到唯一的解决方案 - 从第一部分序列化所有数据(包括$ item_id值);然后缓存序列化字符串并在每次执行脚本时反序列化...
像这样......
if (!$data = $cache->load("part1_cache_id")) {
$item_id = $model->getItemId();
$data['item_id'] = $item_id;
ob_start();
echo 'Here is the cached item id: '.$item_id;
$data['html'] = ob_get_contents();
ob_end_clean();
$cache->save( serialize($data), "part1_cache_id" );
}
$data = unserialize($data);
echo $data['html']
echo never_cache_function($data['item_id']);
还有其他方法可以做这样的伎俩吗? 我正在寻找最高性能的解决方案。
谢谢
已更新 另一个问题是 - 如何在不将页面分成两个模板的情况下将这种缓存实现到控制器中?有可能吗?
PS:请不要建议Smarty,我真的对实现自定义缓存感兴趣。
答案 0 :(得分:1)
您需要更改缓存函数以返回对象或数组。它总是有一个data
字段,其中包含数据和您需要的任何其他字段,即item_id
。
Array(
data => '<h1>whatever data you were caching before</h1>'
item_id => 32,
cache_date => '2010-03-01 12:32:01'
)
这将很好地序列化/反序列化,您可以访问附加到缓存数据的其他参数。
这有意义吗?