2010-04-01 6 views
0

Imaginons que j'ai un code comme ça ...Mise en cache page par parties; comment passer des variables calculées dans des parties mises en cache dans des parties jamais mises en cache?

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; 

Pour autant que vous pouvez voir que je besoin de passer la variable $ item_id en never_cache_function, mais si une partie de poing est mise en mémoire cache (part1_cache_id), alors je n'ai pas façon d'obtenir la valeur $ item_id. Je vois la seule solution - sérialiser toutes les données de la première partie (y compris la valeur $ item_id); cache puis chaîne sérialisés et désérialisable chaque fois le script exécuté ...

Quelque chose comme ça ...

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']); 

Y at-il d'autres moyens pour faire ce truc? Je suis à la recherche de la solution la plus performante.

Merci

MIS À JOUR Et une autre question est - comment mettre en œuvre cette mise en cache dans le contrôleur sans séparer la page en deux modèles? C'est possible? PS: S'il vous plaît, ne suggère pas Smarty, je suis vraiment intéressé par l'implémentation de la mise en cache personnalisée.

Répondre

1

Vous devez modifier votre fonction de mise en cache pour renvoyer un objet ou un tableau. Il aurait toujours un champ data qui contiendrait les données et tous les autres champs dont vous avez besoin, par exemple item_id.

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

Ce sérialisera/deserialze très bien et vous auriez accès à des paramètres supplémentaires liés à vos données mises en cache.

Est-ce que cela a du sens?

+0

Merci pour votre commentaire. Pour autant que je comprenne, c'est semblable à dit par moi. La seule différence est que les routines serialize et unserialize sont incluses dans la mise en cache frontend. – Kirzilla

Questions connexes