File Cache

File Cache – Dosyaya Önbellekleme

Businessman Filing InformationUzuuuun bir aradan sonra http://yazilim.soysal.biz/gizli-silahiniz-cache/ yazı dizisinin 2. yazısı olan File Cache yazımı yazmaya karar verdim.

File Cache dediğimiz olayın aslında literatürde tam olarak bir karşılığı ve tam olarak bir doğru yolu yoktur. Buradaki amaç sunucumuzun veri tabanına giden yükü azaltmak ve kullanıcıya mümkün olduğunca hızlı sonuç döndürmektir.

SQL sunucusundan alının veriler ilk seferinde dosyaya yada dosyalara arşivlenir ve daha sonra bu dosyalardan çekilerek SQL server üzerindeki yük azaltılmış ve istek çok daha hızlı cevaplanmış olur.

Tabi bunu yaparken kullanıcı girişi, ziyaretçi sayısı cookie bilgisi gibi dinamik verileri hesaba katmak lazım. Şimdilik bunları göz ardı ediyorum.

Tüm HTML kodunun php tarafına gönderilebilmesi için öncelikle sayfanın tüm çıktısının bir değişkene atanması gerekir.

Şöyle bir örnek dosyamız oluşur:

index.php :

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<?php
include ('functions.php');
fileCache('');
ob_start();
?>
<html>
  <head>
  </head>
  <body>
    Dinamik Veri
  </body>
</html>
<?
$pageContent = ob_get_contents();
ob_end_clean();
fileCache(json_encode($pageContent));
?>

functions.php

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
<?php
/*
* File Cache Function
* @author Coşkun Soysal
* @since 05.02.2010
*/
function fileCache($fileContent='') {
 
$address= (!empty($_SERVER['HTTPS'])) ? "https://".$_SERVER['SERVER_NAME'].$_SERVER['REQUEST_URI'] : "http://".$_SERVER['SERVER_NAME'].$_SERVER['REQUEST_URI'];
 
$address = md5($address);
 
$cachePeriod = 86400; // 1 day = 86400 seconds
$cachedFile =  "cache/".$address.".txt";
$minimumFileSize = 10; // 10 kb
$runCache = 0;
 
if(!file_exists($cachedFile)) {
$runCache =1;
}else  if((time() - filemtime($cachedFile))&gt;$cachePeriod) {
$runCache = 1;
}else if(filesize($cachedFile)&lt;$minimumFileSize){
$runCache = 1;
}else{
return json_decode(file_get_contents($cachedFile));
exit;}
 
if($runCache == 1){
file_put_contents($cachedFile,json_encode($fileContent));
}
}
?>

İndex.php isimli örnek dosyamız dosyaya kaydetmek istediğimiz dinamik veri içeren dosyamızdır.

Bu sayfada ilk defa fileCache çağrıldığında sayfanın daha önceden cachelenip cachelenmediğini kontrol eder. Eğer sayfa daha önceden çağrılmışsa sayfayı cache dosyasından getirir. Php dosyasının geri kalan kısmını okumadan çıkar.

Eğer sayfa daha önceden çağrılmamış veya period zamanı aşılmışsa sayfanın sonunda ulaşır ve fileCache fonksiyonu içinde cache kaydetme işlemini gerçekleştirir.

Bu sayede dinamik veri bir defa oluşturulacak ve bundan sonraki her istek için sadece statik bir data okunacaktır.

Bu yöntemin sabit diskteki alandan kaybetme, disk ayosu oluşturma ve güncellenen verinin hemen izlenememesi gibi yan etkileri mevcuttur. Bir IT’ci kontrolünde kullanılması tavsiye edilir. :)

5 thoughts on “File Cache – Dosyaya Önbellekleme

  1. engin

    Aralık 23, 2011 at 9:01pm

    bu olay bana programlama mantığına ters gibi geliyor. bi kere dosya sistemi veritabanından çok daha yavaştır. eğer dosya kullanacaksak veri tabanı neden icad edilmiş. düşüncem de doğrumuyum acaba?

  2. Coşkun Soysal

    Aralık 23, 2011 at 9:09pm

    Haklısınız ama çok yoğun yük altındaki veritabanlarına aynı sonucu alacağını bildiğiniz sorguları sürekli yapmak veritabanına yük getiriyor.

    Özellikle kısıtlı bellek ile çalışırken bu yöntem kurtarıcı olabiliyor.

    Halen büyük bir veritabanında kullanılmakta ve çok sevilmektedir :)

  3. engin

    Aralık 26, 2011 at 6:53pm

    teşekkürler cevabınız için.

  4. cemi

    Kasım 2, 2012 at 8:13am

    Öncelikle cevpa için teşekkürler. sizin sayenizde Sitem daha hızlı acılıyor sayfaları ara geçişler. teşekkürler

  5. Coşkun Soysal

    Mart 21, 2013 at 2:30pm

    İlginize ben teşekkür ederim. Yazımın işe yaramış olmasına sevindim. İyi çalışmalar

Bir Cevap Yazın

Your email will not be published. Name and Email fields are required.

Şu HTML etiketlerini ve özelliklerini kullanabilirsiniz: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>