2013-08-07 10 views
5

DB'den içerikli bir tablo oluşturan bir işlev var. Bazı hücreler, bir şablonlama sistemi aracılığıyla file_get_contents ile okuduğum özel HTML'ye sahiptir.file_get_contents önbellek kullanıyor mu?

Küçük içerik aynıdır ancak bu işlem belki 15 kez gerçekleştirilir (her sayfada 15 tablo satırı sınırı var). Dosya içeriğinin aynı olduğunu görürse file_get_contents önbellekleme yapar mı?

+7

Kısa yanıt: Hayır. – deceze

+0

file_get_contents temel olarak fopen, fread, fclose vb. Için bir kısayoldur - bu yüzden bir dosya tanıtıcısını açmayı ve yayılmayı hayal etmemeyi hayal ediyorum. – Jimbo

+0

PHP'de '$ cache = true' seçebileceğim bir dosya okuma fonksiyonu var mı? – silkfire

cevap

4

file_get_contents(), önbelleğe alma mekanizmasına sahip değildir. Ancak, kendi önbelleğe alma mekanizmanızı yazabilirsiniz.

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

GÜNCELLEME önceki if durumda, artık geçerli zamana karşılaştırarak yanlış doğrultulur: Burada

bir taslağıdır. Teşekkürler @Arrakeen.

+2

PHP, APC - http://php.net/manual/en/book.apc.php –

+7

adlı bir önbelleğe alma desteğine sahiptir. Bu nedenle, bir dosyanın içindeki bir dosyanın içeriğini önbelleğe alıyorsunuz ...?! ?! – deceze

+1

Bu aslında daha yavaş yapacaktır. – Gerry

2

Beğen @deceze diyor, genellikle cevap hayır. Ancak, işletim sistemi düzeyinde önbellekler, daha hızlı erişim için son kullanılan dosyaları önbelleğe alabilir, ancak kullanılabilir olanlara güvenmem. Her istekte birden çok kez okunan bir dosyayı önbelleğe almak isterseniz, bir sarmalayıcı işlevinin içinde önbellek olarak hareket etmek için statik bir değişken kullanmayı düşünün.

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

birden çok kez sadece diskten bir defa dosyasını okuyacak my_file_read ($ dosya) çağrılması, sonraki aramalarda işlev içinde statik değişkenin değerini okuyacaktır. Büyük bir dosya ya da sayfa başına sadece bir kez kullanılanlar için bu yaklaşıma güvenmemelisiniz, çünkü statik değişkenin kullandığı bellek isteğin sonuna kadar devam edecektir. Dosyaların içeriğini statik değişkenlerde gereksiz yere tutmak, komut dosyanızın bir bellek kıskacını oluşturmanın iyi bir yoludur.