1. Player'ı Bloke Eden vs Etmeyen İşlemler
Sunucu işlemlerini iki gruba ayırdık: Player'ın çalmak için cevabını zorunlu olarak beklediği istekler ve arka planda sessizce çalışan istekler.
Player'ı Bekletenler
Bunlar bitmeden ses çıkmaz
/stream — Premium Kontrolü
Kullanıcının aboneliği var mı? Her seferinde veritabanına taze sorgu atıyor. Cache kullanmıyor.
20-500 ms gecikme
/hls-key — Şifreleme Anahtarı
Şarkı şifresini çözmek için gereken anahtar dosyası diskten okunuyor.
10-50 ms gecikme
/hls/master.m3u8 — Playlist İşleme
HLS playlist dosyası okunup, URL'lere imza parametreleri ekleniyor (regex ile).
30-100 ms gecikme
Toplam: 60-650 ms bekleme (yavaş internette 3-8 sn)
Arka Planda Çalışanlar
Bunlar donmaya sebep olmaz
track-start — Dinleme Kaydı
Şarkı zaten çalmaya başladıktan sonra gönderilir. Kullanıcı bunu fark etmez.
20-50 ms (ama şarkı çalıyor)
track-hit — 30 sn Sayaç
30 saniye sonra arka planda çalışır. Player'a hiçbir etkisi yok.
20-50 ms (30 sn sonra)
track-end — Bitiş Kaydı
sendBeacon ile "gönder ve unut" yöntemiyle çalışır. Player hiç beklemez.
0 ms bekleme (fire-and-forget)
popular() — Popüler Listesi
Redis'te 30 dakika cache'li. Hızlı yanıt verir.
5-20 ms (cache'li)
2. Seri Bekleme Zinciri — Donmanın Ana Sebebi
3 bloke eden istek birbirini bekleyerek sırayla çalışır. Biri bitmeden diğeri başlayamaz. Bu seri zincir, yavaş internette toplam beklemeyi katlar.
HLS Modu — Seri Zincir (Şu Anki Durum)
Her istek bir öncekinin cevabına bağlı. Paralel çalışamaz.
0 ms
"Çal" butonuna basıldı
Player sunucuya stream URL isteği gönderiyor
20 ms
bekle...
isPremium() — Veritabanı Sorgusu
Her şarkıda taze sorgu. "Bu kullanıcının aboneliği var mı?" diye DB'ye soruyor. Sonucu cache'lemiyor.
200 ms
İmzalı URL üretimi (HMAC-SHA256)
Kontrol geçti → şifreli stream adresi üretiliyor. Bu hızlı (kripto işlem).
1-2 ms250 ms
bekle...
Şifreleme Anahtarı İndirme
HLS şarkının şifresini çözmek için .key dosyası sunucu diskinden okunuyor (file_get_contents()).
400 ms
bekle...
HLS Playlist İşleme
master.m3u8 dosyası diskten okunuyor, içindeki URL'lere preg_replace() ile imza parametreleri ekleniyor.
600 ms
bekle...
İlk Segment İndirme + AES-128 Şifre Çözme
İlk ses parçası indirilip CPU'da şifresi çözülüyor. Eski cihazlarda bu adım en yavaş olanıdır.
1000 ms
Ses Çıkıyor!
İyi internette ~1 sn. Yavaş internette 3-8 sn sessizlik ve donma.
MP3 Modu (Soft Mode) — Kısa Zincir
Key, playlist ve şifre çözme adımları tamamen ortadan kalkıyor. 4 adım yerine 2 adım.
0 ms
"Çal" butonuna basıldı → Stream URL isteği
20 ms
isPremium() — Tek kalan bekleme noktası
Bu da cache'lenirse ~5 ms'ye düşer
300 ms
Ses Çıkıyor!
Key yok, playlist yok, şifre çözme yok. Howler.js doğrudan MP3 çalmaya başlıyor.
HLS: 4-6 seri istek → 1-8 sn bekleme
MP3: 1 istek → 0.3-2 sn bekleme
%60-75 daha hızlı başlangıç
3. Her Endpoint'in Detaylı Analizi
isPremium() — Her Şarkıda Taze DB Sorgusu
EN YAVAŞSongStreamController.php, satır 82 → User model, satır 454-472
Şu An Ne Yapıyor?
- Her şarkıda veritabanına gidip
subscription_expires_atalanını soruyor - Daha önce sorguladığı sonucu cache'lemiyor
- 10 şarkı dinlerse 10 kez aynı sorguyu tekrarlıyor
- Her sorgu 20-100 ms (yavaş DB'de 200-500 ms)
Ne Yapılmalı?
- Sonucu Redis'te 5 dakika cache'le
- Abonelik durumu 5 dakikada değişmez
- Cache hit: 20-100 ms → 1-2 ms
- 10 şarkı = 10 × 100 ms = 1 sn tasarruf
serveKey() — Disk'ten Anahtar Okuma
ORTASongStreamController.php, satır 553-633
Şu An Ne Yapıyor?
-
file_get_contents()ile diskten .key dosyası okuyor - İmza doğrulaması yapıyor (HMAC-SHA256)
- Disk I/O: 10-50 ms (yoğun saatlerde daha uzun)
Ne Yapılmalı?
- Key binary'yi Redis'te cache'le (24 saat TTL)
- Key dosyaları çok küçük (~16 byte) — Redis'te yer kaplamaz
- Disk I/O → Redis: 10-50 ms → 1 ms
Soft Mode'da (MP3): Bu endpoint hiç çağrılmaz. Key dosyası sadece HLS şifreli akış için gereklidir. MP3'te şifreleme yok → bu gecikme tamamen ortadan kalkar.
serveHls() — Playlist Regex İşleme
ORTASongStreamController.php, satır 645-743
Şu An Ne Yapıyor?
- Diskten .m3u8 playlist dosyasını okuyor
- 2 adet
preg_replace()ile URL'lere imza ekleniyor - 30-100 ms (büyük playlist'lerde daha uzun)
Ne Yapılmalı?
- Playlist'leri önceden işleyip cache'le
- Veya HLS convert sırasında imzalı URL'leri doğrudan göm
Soft Mode'da (MP3): Bu endpoint hiç çağrılmaz. MP3 tek dosyadır, playlist yoktur. Bu gecikme tamamen ortadan kalkar.
recent() — Son Dinlenenler (Cache'siz)
DÜŞÜKSongController.php, satır 24-81
Şu An Ne Yapıyor?
- Her çağrıda 2-3 fresh DB sorgusu
- Redis cache yok (popular() var ama recent() yok)
- 100-300 ms response süresi
Ne Yapılmalı?
- Redis cache (5 dakika TTL)
- 100-300 ms → 5-10 ms
Not: Bu endpoint şarkı çalmayı değil, liste yüklemeyi etkiler. Doğrudan donma yapmaz ama sayfa yüklenme hızını düşürür.
4. Çözüm Özeti
| Sorun | Şu An | Cache Sonrası | Soft Mode |
|---|---|---|---|
| isPremium() DB sorgusu | 20-500 ms | 1-2 ms (Redis) | 1-2 ms (Redis) |
| Key disk okuma | 10-50 ms | 1 ms (Redis) | Yok (MP3'te key yok) |
| Playlist regex | 30-100 ms | 5 ms (pre-process) | Yok (MP3'te playlist yok) |
| Segment + şifre çözme | 100-400 ms | 100-400 ms (değişmez) | Yok (MP3'te şifreleme yok) |
| recent() listesi | 100-300 ms | 5-10 ms (Redis) | 5-10 ms (Redis) |
| TOPLAM BEKLEME | 260-1350 ms | 110-420 ms | 5-15 ms |
Şu An (HLS, cache yok)
Yavaş internette bekleme
HLS + Cache Optimizasyonu
Büyük iyileşme
Soft Mode (MP3)
Neredeyse anında