🔴 Settings Cache Sorunu

📅 Tarih: 2025-11-30 17:10 | 🎯 Tenant: ixtif.com (Tenant 2) | 👤 Kaynak: a-html.txt debug çıktısı | 🌐 URL: Homepage (/)

⚠️ N+1 QUERY SORUNU TESPİT EDİLDİ

Homepage'de 89 query çalışıyor ve 74 tanesi duplicate! Settings cache sistemi çalışmıyor, her setting() çağrısı database'e gidiyor.

📊 Mevcut Durum

89
Total Query Sayısı
74
Duplicate Query
214ms
Total Query Süresi
~4.5s
Sayfa Yükleme

✅ İyi Haber: Session Sorunu Çözüldü!

  • Session delete: 16.8s → 0ms ✅
  • Session update: 5s → 0ms ✅
  • Redis driver aktif ✅
  • Total süre: 23.3s → 4.5s (5x hızlanma) ✅

🔍 Tekrarlanan Query'ler (N+1 Problemi)

1. site_title 6x TEKRAR

SELECT * FROM settings WHERE key = 'site_title' AND is_active = 1 LIMIT 1

site_title ayarı 6 farklı yerde çağrılıyor: header, footer, meta tags, breadcrumb, title tag, copyright

Sebep: Her çağrıda database'e gidiyor, cache kullanılmıyor!

2. site_logo 4x TEKRAR

SELECT * FROM settings WHERE key = 'site_logo' AND is_active = 1 LIMIT 1

Logo ayarı header'da 4 farklı yerde çağrılıyor (desktop, mobile, sticky, footer)

3. site_kontrast_logo 3x TEKRAR

SELECT * FROM settings WHERE key = 'site_kontrast_logo' AND is_active = 1 LIMIT 1

4. settings_values 7+ x TEKRAR

SELECT * FROM settings_values WHERE setting_id = 1 LIMIT 1

Aynı setting value'su defalarca sorgulanıyor!

💡 Kök Neden Analizi

Neden Cache Çalışmıyor?

CLAUDE.md'de belirtildiğine göre daha önce Settings global cache optimizasyonu yapılmış (700+ query → 2 query).

Ancak şu anda bu cache çalışmıyor!

Olası Sebepler:

  • Cache süresi dolmuş olabilir
  • Cache key'leri yanlış hesaplanıyor olabilir
  • Redis cache çalışmıyor olabilir (settings için)
  • Helper fonksiyonu cache'i atlamış olabilir
  • Tenant bazlı cache key'leri düzgün çalışmıyor olabilir

Helper Fonksiyonu: setting()

Konum: Modules/SettingManagement/app/Helpers/setting_helpers.php

Bu fonksiyon her çağrıldığında database'e gidiyor. Oysa global cache kullanmalı!

Beklenen Davranış:

  • İlk çağrıda tüm settings'leri cache'e al (tek query)
  • Sonraki çağrılarda cache'den çek (0 query)
  • Cache süresince database'e gitme!

✅ Çözüm Stratejisi

1. Settings Helper'ı İncele KRİTİK

Modules/SettingManagement/app/Helpers/setting_helpers.php dosyasını kontrol et:

  • Cache mantığı var mı?
  • Cache key doğru mu?
  • Tenant bazlı cache çalışıyor mu?
  • Cache süresi ne kadar?

2. Global Settings Cache Ekle KRİTİK

Eğer cache yoksa veya bozuksa, şu mantığı uygula:

  • Request başında tüm settings'leri çek (tek query)
  • Memory'de sakla (static array veya cache)
  • setting() her çağrıldığında memory'den dön
  • Cache lifetime: 1 saat veya kalıcı (settings nadiren değişir)

Beklenen Sonuç:

❌ ŞİMDİ:
site_title → 6 query
site_logo → 4 query
Toplam: 74 duplicate query
✅ SONRA:
Tüm settings → 1 query (ilk çağrı)
Sonraki çağrılar → 0 query
~85-95% azalma!

3. AppServiceProvider'da Global Cache YÜKSEK

Alternatif çözüm: Settings'leri AppServiceProvider::boot()'da yükle

  • Boot metodunda tüm settings'leri çek
  • Cache'e veya config'e yaz
  • Helper fonksiyonu config'den oku

4. View Composer Kullan YÜKSEK

Tüm view'lerde kullanılan settings'leri View Composer ile paylaş

  • Tek sorguda tüm common settings'leri çek
  • Tüm view'lere otomatik inject et
  • Helper çağrısına gerek kalmaz

📈 Beklenen İyileşme

89 → ~10
Query Sayısı (%90 azalma)
74 → ~0
Duplicate Query (%100 azalma)
214ms → ~50ms
Query Süresi (%75 azalma)
4.5s → ~2s
Sayfa Yükleme (2x hızlanma)

❌ ŞİMDİ

  • 89 query (74 duplicate)
  • 214ms query süresi
  • 4.5s sayfa yükleme
  • Her setting çağrısı → DB query

✅ CACHE SONRASI

  • ~10 query (0 duplicate)
  • ~50ms query süresi
  • ~2s sayfa yükleme (hedef!)
  • Settings → Memory/Cache'den

🎯 Sonraki Adımlar

Adım 1: Helper Dosyasını İncele

  • setting_helpers.php'yi oku
  • Cache mantığını kontrol et
  • Neden çalışmadığını tespit et

Adım 2: Cache Sistemini Düzelt veya Ekle

  • Global settings cache ekle
  • Helper fonksiyonunu güncelle
  • Tenant bazlı cache key'leri düzelt

Adım 3: Test Et

  • Homepage'i yenile
  • a-html.txt'yi kontrol et
  • Query sayısının düştüğünü onayla
  • Duplicate query'lerin kaybolduğunu doğrula