2013-08-07 12 views
5

Mam funkcję, która generuje tabelę z zawartością z DB. Niektóre komórki mają niestandardowy kod HTML, który odczytuję za pomocą file_get_contents za pośrednictwem systemu szablonów.Czy file_get_contents używa pamięci podręcznej?

Mała treść jest taka sama, ale ta czynność może być wykonana 15 razy (mam limit 15 wierszy tabeli na stronę). Czy też cache file_get_contents, jeśli widzi, że zawartość jest taka sama?

+7

Krótka odpowiedź: nr – deceze

+0

file_get_contents jest po prostu skrótem do fopen, fread, fclose itd. - więc wyobrażam sobie, że otwarcie wskaźnika pliku i freading go nie jest buforowany. – Jimbo

+0

Czy istnieje funkcja odczytu plików w PHP, gdzie mogę wybrać '$ cache = true'? – silkfire

Odpowiedz

4

file_get_contents() nie ma mechanizmu buforowania. Możesz jednak napisać własny mechanizm buforowania.

Oto zanurzenie:

$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 poprzedni if przypadek jest nieprawidłowy, teraz naprawione przez porównanie do obecnego czasu. Dzięki @Arrakeen.

+2

PHP ma natywną obsługę buforowania o nazwie APC - http://php.net/manual/en/book.apc.php –

+7

Więc ... buforujesz zawartość pliku w pliku ...?! ?! – deceze

+1

To spowoduje, że będzie wolniej. – Gerry

2

Podobnie jak @deceze, generalnie odpowiedź brzmi: nie. Jednak pamięci podręczne na poziomie systemu operacyjnego mogą buforować ostatnio używane pliki, aby uzyskać szybszy dostęp, ale nie liczę na to, że są dostępne. Jeśli chcesz buforować plik, który jest odczytywany wiele razy na żądanie, rozważ użycie zmiennej statycznej do działania jako pamięć podręczna w funkcji opakowania.

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]; 
} 

Wywołanie my_file_read ($ filename) wielokrotnie będzie czytać tylko plik z dysku jeden raz, kolejne wywołania odczyta wartość od statycznej zmiennej wewnątrz funkcji. Należy zauważyć, że nie należy liczyć na to podejście w przypadku dużych plików lub używanych tylko raz na stronę, ponieważ pamięć używana przez zmienną statyczną będzie obowiązywać do końca żądania. Utrzymywanie zawartości plików niepotrzebnie w statycznych zmiennych jest dobrym sposobem na uczynienie twojego skryptu świnią pamięci.

Powiązane problemy