Php 按部分缓存页面;如何将缓存部分中计算的变量传递到从不缓存的部分?

Php 按部分缓存页面;如何将缓存部分中计算的变量传递到从不缓存的部分?,php,caching,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_cach

让我们想象一下,我有一个这样的代码

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;
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']);
就您所见,我需要将$item\u id变量传递到never\u cache\u函数,但如果第一部分被缓存(part1\u cache\u id),那么我就无法获得$item\u id值。我看到了唯一的解决方案——序列化第一部分的所有数据(包括$item_id值);然后缓存序列化的字符串并在每次执行脚本时取消序列化

像这样的

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

您需要更改缓存函数以返回对象或数组。它总是有一个
数据
字段,其中包含数据和您需要的任何其他字段,即
项目id

Array(
  data => '<h1>whatever data you were caching before</h1>'
  item_id => 32,
  cache_date => '2010-03-01 12:32:01'
)
数组(
data=>“以前缓存的任何数据”
项目id=>32,
缓存日期=>'2010-03-01 12:32:01'
)
这将很好地序列化/反序列化,并且您可以访问附加到缓存数据的其他参数


这有意义吗?

谢谢您的评论。据我所知,这与我所说的相似。唯一的区别是序列化和非序列化例程包含在缓存前端中。