2013-08-07 10 views
5

Ich habe eine Funktion, die eine Tabelle mit Inhalten aus der DB generiert. Einige Zellen haben benutzerdefiniertes HTML, das ich mit file_get_contents über ein Vorlagensystem einlese.Verwendet file_get_contents einen Cache?

Der kleine Inhalt ist der gleiche, aber diese Aktion wird vielleicht 15 mal ausgeführt (ich habe ein Limit von 15 Tabellenzeilen pro Seite). Wird cache_get_contents zwischengespeichert, wenn der Content identisch ist?

+7

Kurze Antwort: Nr. – deceze

+0

file_get_contents ist im Grunde nur eine Abkürzung für fopen, fread, fclose usw. - also stelle ich mir vor, einen Dateizeiger zu öffnen und zu fischen, dass er nicht zwischengespeichert wird. – Jimbo

+0

Gibt es in PHP eine Dateilesefunktion, in der ich $ cache = true wählen kann? – silkfire

Antwort

4

file_get_contents() hat keinen Caching-Mechanismus. Sie können jedoch Ihren eigenen Caching-Mechanismus schreiben. Hier

ist ein Entwurf:

$cache_file = 'content.cache'; 
if(file_exists($cache_file)) { 
    if(time() - filemtime($cache_file) > 86400) { 
    // too old , re-fetch 
    $cache = file_get_contents('YOUR FILE SOURCE'); 
    file_put_contents($cache_file, $cache); 
    } else { 
    // cache is still fresh 
    } 
} else { 
    // no cache, create one 
    $cache = file_get_contents('YOUR FILE SOURCE'); 
    file_put_contents($cache_file, $cache); 
} 

UPDATE der vorherigen if Fall ist falsch, jetzt durch den Vergleich der aktuellen Zeit behoben werden. Danke @Arrakeen.

+2

PHP hat eine native Caching-Unterstützung namens APC - http://php.net/manual/en/book.apc.php –

+7

Also ... Sie den Inhalt einer Datei in einer Datei zwischenspeichern ...?! ?! – deceze

+1

Das wird es tatsächlich langsamer machen. – Gerry

2

Wie @deceze sagt, ist die Antwort im Allgemeinen nein. Caches auf Betriebssystemebene können jedoch kürzlich verwendete Dateien zwischenspeichern, um einen schnelleren Zugriff zu ermöglichen, aber ich würde nicht damit rechnen, dass diese verfügbar sind. Wenn Sie eine Datei, die mehrmals pro Anforderung gelesen wird, zwischenspeichern möchten, sollten Sie eine statische Variable als Cache in einer Wrapper-Funktion verwenden.

function my_file_read($filename) { 
    static $file_contents = array(); 
    if (!isset($file_contents[$filename])) { 
    $file_contents[$filename] = file_get_contents($filename); 
    } 
    return $file_contents[$filename]; 
} 

Aufruf my_file_read ($ filename) mehr Male nur die Datei von der Festplatte ein einziges Mal gelesen werden, werden nachfolgende Aufrufe den Wert aus den statischen Variablen innerhalb der Funktion lesen. Beachten Sie, dass Sie sich bei großen Dateien oder solchen, die nur einmal pro Seite verwendet werden, nicht auf diesen Ansatz verlassen sollten, da der von der statischen Variablen verwendete Speicher bis zum Ende der Anforderung bestehen bleibt. Den Inhalt von Dateien unnötigerweise in statischen Variablen zu halten, ist eine gute Möglichkeit, Ihr Skript zu einem Gedächtnisschwund zu machen.