Merhaba, bu yazımızda sizlere PHP de Cache (Önbellek) yapımından bahsedeceğiz. Öncelikle cachenin ne olduğunu ve çeşitlerini anlatacağız sonrasında ise örneklerle cache sistemimizi yapıcaz ve kendi yazılımınıza nasıl entegre ediceksiniz bunu da görmüş olucaz.
Bu yazımızda önce cache (Önbellek) kütüphanemizi yazıcaz anahtar değer şeklinde verilerimizi saklamamızı ve istediğimiz zaman çağırmamızı sağlıyıcak. Sonra da tüm sayfa HTML çıktısını kaydeden bir sistemi nasıl yapıcaz buna örnek vericez.
Cache (Önbellek) Nedir?
Cache (Önbellek) verilerimizin belli anahtarlar ile saklandığı ve çok hızlı bir şekilde geri çağırabildiğimiz sistemlerdir. Örneğin çok fazla işlemci ve ram harcayan bir veritabanı sorgumuz veya çok fazla sorgu içeren bir web sayfamız olduğunu düşünelim. Cache sistemimizde bu sorguya bir isim veririz örneğin “tum_urunler” şeklinde sonrasında ise bu sorguyu ilk sefer çalıştırdığımızda sonucunu bu anahtar ile kaydederiz. Sayfa tekrar açıldığında tüm işlemleri baştan yapmak yerine sadece hazır veriyi çağırır ve kullanırız.
Cache ( Önbellek ) Sistemini Kodlayalım.
Sistemimizi kodlamak için öncelikle boş bir php projesi oluşturuyoruz. Ben lib ve cache adında iki dizin oluşturuyorum. Birinde kütüphanemizin kodlarını diğerinde cache dosyalarımızı tutabiliriz.

Lib klasörümüzün içinde FileCache.php adında bir dosya oluşturuyoruz. Adını bu şekilde seçtim çünkü verileri dosya halinde saklıyıcaz. Dosyamızın içerisine aşağıdaki kodları yapıştıralım. Sonrasında sırayla kodların ne işe yaradığını anlatacağım.
<?php
class FileCache
{
private $cache_dir;
private $ttl;
public function __construct($cache_dir, $ttl = 3600)
{
$this->cache_dir = $cache_dir;
$this->ttl = $ttl;
}
public function set($key, $value)
{
$filename = $this->cache_dir . '/' . $key;
$new_value = [
'value' => $value,
'time' => time()
];
$value = serialize($new_value);
file_put_contents($filename, $value);
}
public function get($key)
{
$filename = $this->cache_dir . '/' . $key;
if (file_exists($filename) && (time() - filemtime($filename) < $this->ttl)) {
return unserialize(file_get_contents($filename))['value'];
}
if (file_exists($filename)) {
unlink($filename);
}
return null;
}
public function delete($key)
{
$filename = $this->cache_dir . '/' . $key;
if (file_exists($filename)) {
unlink($filename);
}
}
public function delete_all()
{
$files = glob($this->cache_dir . '/*');
foreach ($files as $file) {
if (is_file($file)) {
unlink($file);
}
}
}
public function delete_expired()
{
$files = glob($this->cache_dir . '/*');
foreach ($files as $file) {
if (is_file($file) && (time() - filemtime($file) >= $this->ttl)) {
unlink($file);
}
}
}
}
Sırasıyla cache sınıfımızdaki metodları sizlere anlatalım.
__construct($cache_dir, $ttl)
Bu metod, FileCache sınıfının bir örneğini oluştururken çağrılır. Bu metod, $cache_dir ve $ttl parametrelerini alır ve bu değerleri sınıfın özelliklerine atar.
$cache_dir : Bu dizin, cache dosyalarının saklanacağı dizindir. Örneğin, cache dosyalarını /tmp/cache dizinine kaydetmek istediğimizde, bu dizini $cache_dir parametresi olarak belirtebiliriz.
$ttl : ise cache dosyalarının ne kadar süreyle geçerli olacağını belirtir. Varsayılan olarak 3600 saniyedir (1 saat).
set($key, $value)
Bu metod, bir değeri cache’e kaydeder. $key parametresi, değerin cache’de nasıl saklanacağını belirler. $value parametresi ise cache’e kaydedilecek değeri belirtir.
$key : Cache’de saklanacak değerin anahtarıdır. Bu anahtar, cache’den değeri okurken kullanılır. Örneğin, bir kullanıcının bilgilerini cache’e kaydetmek istediğimizde, bu kullanıcının id’sini $key olarak belirleyebiliriz.
$value : Cache’e kaydedilecek değeri belirtir. Bu değer, herhangi bir veri tipi olabilir. Örneğin, bir kullanıcının bilgilerini içeren bir dizi, bir metin, bir sayı vb. olabilir.
get($key)
Bu metod, cache’de saklanan bir değeri döndürür. $key parametresi, cache’de saklanan değeri belirtir. Eğer belirtilen anahtarla bir değer cache’de saklanmışsa ve bu değer hala geçerliyse, bu değeri döndürür. Eğer belirtilen anahtarla bir değer cache’de saklanmamışsa veya bu değer geçerli değilse, null değerini döndürür.
$key : Cache’de saklanan değeri belirten anahtardır. Bu anahtar, set() metodunda belirtilen anahtarla aynı olmalıdır. Örneğin, bir kullanıcının bilgilerini cache’den okumak istediğimizde, bu kullanıcının id’sini $key olarak belirtebiliriz.
delete($key)
Bu metod, cache’de saklanan bir değeri siler. $key parametresi, silinecek değerin anahtarını belirtir. Eğer belirtilen anahtarla bir değer cache’de saklanmışsa, bu değeri siler. Eğer belirtilen anahtarla bir değer cache’de saklanmamışsa, herhangi bir işlem yapmaz.
$key : Cache’den silinecek değerin anahtarını belirtir. Bu anahtar, set() metodunda belirtilen anahtarla aynı olmalıdır. Örneğin, bir kullanıcının bilgilerini cache’den silmek istediğimizde, bu kullanıcının id’sini $key olarak belirtebiliriz.
delete_all()
Bu metod, cache’de saklanan tüm değerleri siler. Eğer cache’de saklanan hiçbir değer yoksa, herhangi bir işlem yapmaz. Eğer cache’de saklanan bir veya daha fazla değer varsa, bu değerleri siler.
delete_expired()
Bu metod, cache’de saklanan geçerliliğini yitirmiş (expired) tüm değerleri siler. Eğer cache’de saklanan hiçbir değer yoksa, herhangi bir işlem yapmaz. Eğer cache’de saklanan bir veya daha fazla değer varsa ve bu değerlerden bir veya daha fazlası geçerliliğini yitirmişse, bu değerleri siler.
Şu anda temel olarak cache sistemimizi sınıfımızı kodladık. Ve her fonksiyonun ne işe yaradığını sizlere anlattık. Şimdi sıra örneklere geldi.
Cache (Önbellek) Kullanım Örnekleri
Yukarıda kodlarığımız sınıfımızı kullanarak bir kaç örnek yapalım.
Veritabanı Sorgusu Kaydetme Örneği
İlk örneğimiz veritabanı sorgularının sonuçlarınu nasıl kaydedeceğiz ve geri çağıracağız buna basit bir örnek vereceğiz. Öncelikle sorgumuza bir isim vereceğiz sonra bu isim ile cache sınıfımızdan çağıracağız eğer yoksa yeniden oluşturacağız. Bir kullanıcıya ait bilgileri sorguladığımız örneğimiz şu şekilde :
Kod Örneği
<?php
// Cache sınıfımızı dahil ediyoruz
require __DIR__ . '/lib/FileCache.php';
// Cache dosyalarının saklanacağı dizini belirtiyoruz
$cache_dir = __DIR__ . '/cache';
$cache_ttl = 3600; // 1 saat
// Cache sınıfını oluşturuyoruz
$cache = new FileCache($cache_dir, $cache_ttl);
// Kullanıcı id'si
$user_id = 1;
// Cache anahtarı
$cache_key = 'user_' . $user_id;
// Cache'den kullanıcı bilgilerini al
$user = $cache->get($cache_key);
if($user === null) {
// Cache'de kullanıcı bilgileri yok, veritabanından al
$user = get_user_from_database($user_id);
// Cache'e kullanıcı bilgilerini kaydet
$cache->set($cache_key, $user);
}
// Kullanıcı bilgilerini kullan
echo 'Kullanıcı adı: ' . $user['name'] . PHP_EOL;
Özet
Öncelikle FileCache sınıfımızı dahil ediyoruz. Daha sonra cache dosyalarının saklanacağı dizini belirtiyoruz. Cache sınıfını oluştururken bu dizini ve cache geçerlilik süresini belirtiyoruz. Kullanıcı id’sini belirliyoruz ve cache anahtarını oluşturuyoruz. Cache’den kullanıcı bilgilerini alıyoruz. Eğer cache’de kullanıcı bilgileri yoksa, veritabanından alıyoruz ve cache’e kaydediyoruz. Son olarak kullanıcı bilgilerini kullanıyoruz.
Tüm Sayfayı Kaydetme Örneği
Tüm sayfa cache (tüm sayfa önbellek) işlemi için öncelikle ek bir kaç metod kullanmamız gerekiyor bu metodları tanıyalım. Bu metodlar sayesinde sayfamızın HTML çıktısına erişebileceğiz.
ob_start() metodu
Bu metod sayfanın çıktısını tampona alır. Bu metod çağırıldığı andan itibaren sayfa çıktısı ekranda gösterilmez ve biriktirilir. Sayfanın içeriğini ekrana basmadan önce bu değişkende biriktiriyoruz böylelikle ileride kaydedebilicez.
ob_get_clean() metodu
Bu metodla birlikte sayfanın ob_start() ile biriktirilen içeriğine erişiyoruz. Cache ( önbellekleme ) yaparken bu metod sayesinde içeriği ekrana basmadan önce kaydedebiliyoruz.
Bu metodları inceledikten sonra örnek kodumuza geçebiliriz.
<?php
// Cache sınıfımızı dahil ediyoruz
require __DIR__ . '/lib/FileCache.php';
// Cache dosyalarının saklanacağı dizini belirtiyoruz
$cache_dir = __DIR__ . '/cache';
// Cache sınıfını oluşturuyoruz
$cache = new FileCache($cache_dir);
// Cache anahtarı
$cache_key = 'page_' . $_SERVER['REQUEST_URI'];
// Cache'den sayfa içeriğini al
$page_content = $cache->get($cache_key);
if($page_content === null) {
// Cache'de sayfa içeriği yok, sayfa içeriğini oluştur
ob_start();
include 'page.php';
$page_content = ob_get_clean();
// Cache'e sayfa içeriğini kaydet
$cache->set($cache_key, $page_content);
}
echo $page_content;
Özet
Bu örneğimizde sayfamız için öncelikle bir çağırma anahtarı belirledik ve sonrasında ob_start ile sayfa içeriğini kaydetmeye başladık.
Dikkat
Sayfamızı oluşturan php kodları ob_start’dan sonra çağırılmalıdır.
Sonrasında page.php yani sayfa içeriğini oluşturan kodları çağırdık ve sayfa oluştukdan sonra sayfa içeriğini “$page_content” adlı değişkene attık.
Sonrası önceki örneğimiz ile aynı.
Bu sayfa tekrar çalıştığında öncelikle içeriği cache ( önbellek ) den okumaya çalışıcak ve eğer kaydetildiyse oradan alıcak. Sonrasında ise sayfaya basıcak. Kaydedilmediyse ise önceki paragrafda belirttiğim gibi sayfa içeriğini oluşturucak önce kaydedicek sonra da ekrana basıcak.
Cache ( Önbellek ) Temizleme Örneği
Önbellek temizlemek için bulunan metodlarıız şu şekilde delete($key) ve delete_all()
delete($key) :
Belirli bir anahtar için cache değerini siler.
delete_all()
Bevcut dizinde bulunan tüm cache (önbellek) dosyalarını siler.
Örnek Kullanım
<?php
// Cache sınıfımızı dahil ediyoruz
require __DIR__ . '/lib/FileCache.php';
// Cache dosyalarının saklanacağı dizini belirtiyoruz
$cache_dir = __DIR__ . '/cache';
// Cache sınıfını oluşturuyoruz
$cache = new FileCache($cache_dir);
// Kullanıcı id'si
$user_id = 1;
// Cache anahtarı
$cache_key = 'user_' . $user_id;
// Cache'den kullanıcı bilgilerini sil
$cache->delete($cache_key);
// Cache'de saklanan tüm değerleri sil
$cache->delete_all();
Özetle bu örneğimizde istersek belirbi bir veriyi yada tüm veriyi nasıl cache’den sileceğiz göstermiş olduk.
Video Anlatım
Örnek videoda yazımızda anlattıklarımızı sizler için kodladık. Kanalımıza abone olmayı unutmayın.