逐页缓存;如何将缓存部分中计算的变量传递给永不缓存的部分?

时间:2010-04-01 21:23:42

标签: php caching

让我们假设我有一个像这样的代码......

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,我真的对实现自定义缓存感兴趣。

1 个答案:

答案 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'
)

这将很好地序列化/反序列化,您可以访问附加到缓存数据的其他参数。

这有意义吗?