2009-07-08 6 views
4

ich verwende Smarty mit meinem PHP-Code und Ich mag einige der Website-Seiten cachen, so habe ich den folgenden Code:Was ist der beste Weg, um Dateien in PHP zu cachen?

// 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 

aber wenn ich ob_get_contents drucken() am Ende der PHP-Datei ist es leer! und tatsächlich ist die erstellte Cache-Datei auch leer! also wie könnte ich die files in php zwischenspeichern, wenn ich smarty benutze ich weiß, dass ich smarty cache verwenden kann, aber es ist nicht arbeit für mich aus irgendeinem grund.

zusätzlich geben Sie mir bitte Informationen über APC-Cache. wie man es benutzt? ist es wert in meinem Fall zu verwenden, ich verdünne es ist nur zum Cachen von Datenbankabfragen, ich lese das PHP-Handbuch darüber, aber ich kann nichts bekommen :) Tanks.

Antwort

1

Ich habe etwas Code aus der Dokumentation (befindet sich here) für ein vollständigeres Beispiel des Smarty-Cache. Außerdem bin ich mir nicht sicher, was Sie in Ihrem Beispiel verwendet haben, aber Sie sollten die Methoden von smarty verwenden, um den Cache zu manipulieren.

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

Wie für APC-Cache wird es auf die gleiche Weise wie Smarty funktioniert. Beide speichern die Daten für eine bestimmte Zeit in einer Datei. Jedes Mal, wenn Sie auf die Daten zugreifen möchten, prüft es, ob der Cache gültig ist, und gibt den Cache-Wert zurück.

Wenn jedoch nicht Smarty verwenden, können Sie APC als solche verwendet werden:
Dieses Beispiel geht durch das Ergebnis einer DB-Abfrage im Cache speichern, in ähnlicher Weise, können Sie dies stattdessen die gesamte Seite ausgegeben, so dass Sie don speichern ändern Ich muss nicht oft teure PHP-Funktionen ausführen.

// 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); 
    } 
} 

mit einer gewissen Logik Zusammen

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 
} 

Dieses Beispiel ist leicht von here modifiziert.

+0

@lan Elliott ja, Smarty Caching ist eine gute Idee, aber ich kann es nicht verwenden. weil ich nur ein $ smarty-> display ('index.tpl') habe; und der Rest von anderen Seiten wie news.tpl kommt in mein index.tpl Center wie folgt {include file = $ page_center} dann benutze ich in der Datei news.php diese Zeile $ smarty-> assign ('page_center', 'news.tpl "); aber wenn ich Caching aktiviere, zeige es mir immer noch den Standardinhalt von Page Center nicht news.tpl, aber wenn ich Caching getan habe, funktioniert es gut. – mehdi

+0

@mehdi Das klingt so, als müssten Sie benutzerdefinierte Cache-IDs verwenden - so können Sie so viele Versionen von 'index.tpl' zwischenspeichern, wie Sie möchten. z.B. in 'news.php' würde man' $ smarty-> display ('index.tpl', 'news |'. $ article_id); 'Für Hilfeseiten eine Cache-ID von' 'help |' . $ topic' usw. (Mit dem Pipe-Zeichen zur Strukturierung Ihrer Cache-IDs können Sie den Cache selektiv löschen, z. B. alle Nachrichtenartikel gleichzeitig löschen.) – searlea

1

Meinen Sie, Sie rufen ob_get_contents() erneut auf, nachdem Sie ob_end_flush() aufgerufen haben? Wenn dies der Fall ist, werden die Daten, die Sie in die Datei geschrieben haben, aus dem Speicher von PHP "gelöscht".

Wenn Sie den HTML-Code weiterhin ausgeben möchten, speichern Sie ob_end_flush zuerst in einer Variablen und übergeben Sie diesen dann an fwrite. Sie können die Variable später auf der Seite verwenden.