aslain.dev
0%
01 Hizmetler 02 Hakkımda 03 Projeler 04 Stack 05 Blog 06 İletişim
← Tüm makaleler Web Geliştirme

Laravel Cache Kullanımı: Performans İçin Rehber

Bir Laravel cache stratejisi, çoğu uygulamanın gerçek dünyada en hızlı kazanç sağlayan tarafıdır. Veritabanına giden her istek, çağrılan her harici API ve render edilen her ağır sayfa zaman maliyetidir; bu sonuçların tekrar tekrar hesaplanması yerine bir kez hesaplanıp saklanması, yanıt sürelerini milisaniyelere indirebilir. Bu rehberde önbellek sürücülerini, sorgu ve sayfa önbelleklemeyi ve en kritik konu olan önbelleği güvenle temizlemeyi pratik örneklerle ele alıyorum.

Önbellek ne zaman işe yarar?

Önbellek, hesaplaması pahalı ama sık değişmeyen veriler için idealdir. Tipik adaylar şunlardır:

  • Ağır JOIN veya toplama içeren raporlama sorguları,
  • Her sayfada görünen menü, ayar veya kategori listeleri,
  • Yavaş veya kotalı harici API yanıtları (döviz kuru, hava durumu),
  • Nadiren değişen tam sayfa HTML çıktıları.

Buna karşılık kullanıcıya özel, anlık doğruluk gerektiren veriler (sepet bakiyesi, ödeme durumu) için önbellek genellikle yanlış tercihtir. İlk kural: önce ölç. Yavaş olduğunu kanıtladığın yeri önbelleğe al.

Sürücüyü doğru seçmek

Laravel önbellek katmanı sürücüden bağımsızdır; yapılandırma config/cache.php içinde, varsayılan store ise .env dosyasındaki CACHE_STORE değişkeniyle belirlenir. Başlıca seçenekler:

  • file — sıfır kurulum, tek sunucuda küçük projeler için yeterli.
  • database — ek servis istemeden kalıcılık; orta yük için iyi.
  • redis / memcached — yüksek trafik, çok sunucu ve tag desteği için önerilen seçim.
  • array — yalnızca tek istek boyunca yaşar; testlerde kullanışlıdır.

Üretimde ciddi trafik bekliyorsanız Redis neredeyse her zaman doğru cevaptır. Yapılandırma şöyle görünür:

# .env
CACHE_STORE=redis
REDIS_HOST=127.0.0.1
REDIS_PORT=6379

Sorgu önbellekleme: remember kalıbı

En çok kullanılan API Cache::remember()'dır: anahtar bellekteyse onu döndürür, değilse closure'ı çalıştırıp sonucu saklar ve geri verir. Bu, "varsa getir, yoksa hesapla ve sakla" mantığını tek satıra indirir.

use Illuminate\Support\Facades\Cache;

$populer = Cache::remember('projects:populer', now()->addHour(), function () {
    return Project::where('is_published', true)
        ->orderByDesc('views')
        ->take(10)
        ->get();
});

Süre olarak bir DateTime (now()->addHour()) veya saniye sayısı verebilirsiniz. Hiç sona ermesini istemiyorsanız Cache::rememberForever() kullanın — ama o zaman temizleme sorumluluğu tamamen sizdedir.

Daha düşük seviyeli ihtiyaçlar için temel metotlar da mevcuttur:

Cache::put('anahtar', $deger, now()->addMinutes(10));
$deger = Cache::get('anahtar', 'varsayilan');
Cache::has('anahtar');
Cache::forget('anahtar');
Cache::increment('ziyaret_sayaci');

Tam sayfa ve fragment önbellekleme

Sorgu önbelleği yetmediğinde render edilmiş HTML'i de saklayabilirsiniz. Controller seviyesinde basit bir kalıp:

public function index()
{
    $html = Cache::remember('home:html', now()->addMinutes(15), function () {
        return view('site.index', $this->verileriYukle())->render();
    });

    return response($html);
}

Tüm yanıtı HTTP düzeyinde önbelleğe almak isterseniz, bunu bir ara katman (middleware) ile yapmak temizdir; isteğin URL'sini anahtar olarak kullanıp Cache::has() ile kontrol eder, yoksa yanıtı üretip saklarsınız. Statik vitrin sayfalarında bu yaklaşım veritabanı yükünü neredeyse sıfıra indirir.

Etiketler ve güvenli temizleme

Önbelleklemenin zor kısmı saklamak değil, doğru anda geçersiz kılmaktır. Bir proje güncellendiğinde ilgili tüm önbellek anahtarlarını silmeniz gerekir. Redis veya Memcached kullanıyorsanız tag'ler bunu zarif hale getirir:

Cache::tags(['projects'])->put('projects:populer', $veri, 3600);

// Bir proje değişince:
Cache::tags(['projects'])->flush();

Etiketler file ve database sürücülerinde desteklenmez; o durumda anahtarları elle silin. En sağlam yöntem, model olaylarına bağlanmaktır:

// Project modelinde
protected static function booted(): void
{
    static::saved(fn () => Cache::forget('projects:populer'));
    static::deleted(fn () => Cache::forget('projects:populer'));
}

Komut satırından ise tüm önbelleği temizlemek için:

php artisan cache:clear

Konfigürasyon, rota ve view önbelleği

Uygulama verisi önbelleğiyle karıştırılmaması gereken ayrı bir katman daha var: çatının kendi önbellekleri. Üretim sunucusunda dağıtımdan sonra şunları çalıştırmak ciddi hız kazandırır:

php artisan config:cache
php artisan route:cache
php artisan view:cache
# hepsini birden:
php artisan optimize

Önemli uyarı: config:cache aktifken env() çağrıları yalnızca yapılandırma dosyaları içinde güvenilir çalışır; kod içinde doğrudan env() kullanmayın, değerleri config() üzerinden okuyun. Yapılandırmayı değiştirdiğinizde php artisan config:clear ile yeniden derleyin.

Sık Sorulan Sorular

Geliştirme yaparken neden değişikliklerim görünmüyor?

Büyük olasılıkla eski bir önbellek servis ediliyor. php artisan optimize:clear komutu config, route, view ve uygulama önbelleğini tek seferde temizler; yerelde sorun yaşadığınızda ilk deneyeceğiniz şey budur.

file mi yoksa Redis mi kullanmalıyım?

Tek sunuculu küçük bir site için file sürücüsü fazlasıyla yeterlidir. Yüksek trafik, birden fazla sunucu, atomik sayaçlar veya tag tabanlı temizleme gerekiyorsa Redis'e geçin.

Önbellek süresini ne kadar vermeliyim?

Verinin güncellik toleransına göre. Saatlik değişen listeler için 15–60 dakika makul; neredeyse hiç değişmeyen veriler için rememberForever() + olay tabanlı temizleme en verimlisidir.

Performansı doğru kurgulanmış bir önbellekle uçurmak mı istiyorsunuz? Laravel uygulamanızın yavaş noktalarını birlikte ölçüp doğru önbellek stratejisini kuralım — benimle iletişime geçin.

Devamı için