2009-07-08 10 views
4

J'utilise Smarty avec mon code php et je tiens à mettre en cache certaines des pages du site donc j'utilisé le code suivant:Quelle est la meilleure façon de mettre en cache des fichiers en php?

// TOP of script 
ob_start(); // start the output buffer 
$cachefile ="cache/cachefile.html"; 
// normal PHP script 
$smarty->display('somefile.tpl.html') ; 
$fp = fopen($cachefile, 'w'); // open the cache file for writing 
fwrite($fp, ob_get_contents()); // save the contents of output buffer to the file 
fclose($fp); // close the file 
ob_end_flush(); // Send the output to the browser 

mais quand j'imprimer ob_get_contents() à la fin du fichier php il est vide! et en fait le fichier cache créé est également vide! alors comment puis-je mettre en cache les fichiers en php lorsque j'utilise smarty je sais que je peux utiliser cache smarty mais ce n'est pas le travail pour moi pour une raison quelconque.

en outre s'il vous plaît donnez-moi des informations sur le cache APC. comment l'utiliser? est-il utile d'utiliser dans mon cas, je mince c'est juste pour la mise en cache des requêtes de base de données, j'ai lu le manuel php à ce sujet mais je ne peux rien obtenir :) réservoirs .

Répondre

1

J'ai mashed une partie du code de la documentation (situé here) pour un exemple plus complet du cache smarty. En outre, je ne suis pas sûr de ce que vous utilisiez dans votre exemple, mais vous devriez utiliser les méthodes de smarty pour manipuler le cache.

require('Smarty.class.php'); 
    $smarty = new Smarty; 

    // 1 Means use the cache time defined in this file, 
    // 2 means use cache time defined in the cache itself 
    $smarty->caching = 2; 

    // set the cache_lifetime for index.tpl to 5 minutes 
    $smarty->cache_lifetime = 300; 

    // Check if a cache exists for this file, if one doesn't exist assign variables etc 
    if(!$smarty->is_cached('index.tpl')) { 
     $contents = get_database_contents(); 
     $smarty->assign($contents); 
    } 

    // Display the output of index.tpl, will be from cache if one exists 
    $smarty->display('index.tpl'); 

    // set the cache_lifetime for home.tpl to 1 hour 
    $smarty->cache_lifetime = 3600; 

    // Check if a cache exists for this file, if one doesn't exist assign variables etc 
    if(!$smarty->is_cached('home.tpl')) { 
     $contents = get_database_contents(); 
     $smarty->assign($contents); 
    } 

    // Display the output of index.tpl, will be from cache if one exists 
    $smarty->display('home.tpl'); 

Comme pour le cache APC, il fonctionnera de la même manière que smarty. Ils stockent tous les deux les données dans un fichier pour une durée spécifique. Chaque fois que vous souhaitez accéder aux données, il vérifie si le cache est valide et, le cas échéant, renvoie la valeur du cache.

Cependant, si vous n'utilisez Smarty vous pouvez utiliser APC en tant que tel:
Cet exemple passe par mémoriser le résultat d'une requête de base de données dans le cache, de même, vous pouvez modifier cela pour stocker au lieu de la totalité de la production de la page afin que vous don Ne pas avoir à exécuter des fonctions PHP coûteuses fréquemment.

// A class to make APC management easier 
class CacheManager 
{ 
    public function get($key) 
    { 
      return apc_fetch($key); 
    } 

    public function store($key, $data, $ttl) 
    { 
      return apc_store($key, $data, $ttl); 
    } 

    public function delete($key) 
    { 
      return apc_delete($key); 
    } 
} 

Combiné avec une certaine logique,

function getNews() 
{ 
    $query_string = 'SELECT * FROM news ORDER BY date_created DESC limit 5'; 

    // see if this is cached first... 
    if($data = CacheManager::get(md5($query_string))) 
    { 
      // It was stored, return the value 
      $result = $data; 
    } 
    else 
    { 
      // It wasn't stored, so run the query 
      $result = mysql_query($query_string, $link); 
      $resultsArray = array(); 

      while($line = mysql_fetch_object($result)) 
      { 
       $resultsArray[] = $line; 
      } 

      // Save the result inside the cache for 3600 seconds 
      CacheManager::set(md5($query_string), $resultsArray, 3600); 
    } 

    // Continue on with more functions if necessary 
} 

Cet exemple est légèrement modifié par here.

+0

@lan Elliott oui, la mise en cache Smarty est une bonne idée mais je ne peux pas l'utiliser. parce que je n'ai qu'un seul $ smarty-> display ('index.tpl'); et le reste des autres pages comme news.tpl entrer dans mon index.tpl centre comme ceci {include file = $ page_center} puis dans le fichier news.php j'utilise cette ligne $ smarty-> assign ('page_center', 'news.tpl '); mais quand j'active la mise en cache, il me montre toujours le contenu par défaut du centre de la page, pas news.tpl, mais quand je cache la mise en cache, ça marche bien. – mehdi

+0

@mehdi Il semble que vous ayez besoin d'utiliser des ID de cache personnalisés, ce qui vous permet de mettre en cache autant de versions de 'index.tpl' que vous le souhaitez. par exemple. dans 'news.php', vous appelez' $ smarty-> display ('index.tpl', 'news |'. $ article_id); 'Pour les pages d'aide, vous pouvez utiliser un cache-id de '' help | ' . $ topic' etc. (L'utilisation du caractère de tuyau pour structurer vos identifiants de cache vous permet d'effacer sélectivement le cache - par exemple effacer tous les articles de presse à la fois.) – searlea

1

Voulez-vous dire que vous appelez ob_get_contents() après avoir appelé ob_end_flush()? Si c'est le cas, les éléments que vous avez écrits dans le fichier auront été "supprimés" de la mémoire de PHP.

Si vous souhaitez toujours sortir le code HTML, enregistrez d'abord ob_end_flush dans une variable, puis passez-le à fwrite. Vous pouvez utiliser la variable plus tard sur la page.