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'
)
这将很好地序列化/反序列化,并且您可以访问附加到缓存数据的其他参数
这有意义吗?谢谢您的评论。据我所知,这与我所说的相似。唯一的区别是序列化和非序列化例程包含在缓存前端中。