Кэширование страницы по частям; как передать переменные, вычисленные в кэшированных частях в никогда не кэшированные части? - PullRequest
0 голосов
/ 02 апреля 2010

Давайте представим, что у меня есть такой код ...

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 Ответ

1 голос
/ 02 апреля 2010

Вам нужно изменить функцию кэширования, чтобы она возвращала объект или массив. В нем всегда будет поле data, которое будет содержать данные и любые другие необходимые вам поля, например item_id.

Array(
  data => '<h1>whatever data you were caching before</h1>'
  item_id => 32,
  cache_date => '2010-03-01 12:32:01'
)

Это очень хорошо сериализует / десериализует, и у вас будет доступ к дополнительным параметрам, прикрепленным к вашим кэшированным данным.

Имеет ли это смысл?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...