Kritik Özet - Neden Bazı Kullanıcılarda Donma?
Basit Anlatım (5 Yaşındaki Çocuğa)
Düşün ki: Bir musluktan su içmek istiyorsun.
Musluk (Sunucu)
Su kaynağı
Boru (İnternet)
Su taşıyan yol
Bardak (Player)
Suyu tutan yer
Şu an olan sorunlar:
- 🔴 Musluk tıkalı: Sunucu her damla için çok düşünüyor (cache yok)
- 🔴 Kapıda sıra var: Aynı IP'den çok kişi gelince "bekle" diyor (throttle)
- 🔴 Bardak küçük: Player yeterince su biriktiremiyor (buffer sorunu)
- 🟡 Boru uzun: Türkiye'den sunucuya mesafe (ama Cloudflare var)
Temel Bulgu (v6):
Donma herkeste değil, bazı kullanıcılarda oluyor. Bu, genel bir kod hatası değil, belirli koşullara bağlı bir sorun demek: Kurumsal ağlar, paylaşımlı WiFi, uzun oturumlar, zayıf cihazlar.
Teknik Özet + Kod Doğrulama
1.61
Load Average
↓ 17.36'dan düştü
6
PHP Process
↓ 54'ten düştü
197
Redis Client
≈ Benzer
83ms
API Latency
→ Değişmedi
DOĞRULANDI (v6)
- •
throttle:120,1IP bazlı aktif - • 5 ayrı ERROR listener mevcut
- • TTL max 60 dakika
- • Segment'ler token'sız (CF için)
HALA SORUNLU
- • Route/Config cache YOK
- • CF Segment cache: MISS
- • OPcache durumu belirsiz
- • 6 middleware her istekte
6 Kritik Sorun (Öncelik Sırasına Göre):
- 1. IP Bazlı Throttle (120/dk) → NAT arkasında 429 hatası
- 2. Route/Config cache YOK → Her istek için +30-50ms
- 3. Çoklu ERROR listener → Race condition riski
- 4. CF Segment cache MISS → Cloudflare bypass
- 5. İmza süresi 60 dk → Uzun oturumlarda 401
- 6. Agresif buffer (200MB) → Zayıf cihazlarda sorun
Güncel Sistem Durumu (17 Şubat 2026)
Basit Anlatım
İyi Haber: Sunucu öncekine göre çok daha rahat!
İyileşen
- ✅ Sunucu yükü %90 azaldı (17 → 1.6)
- ✅ PHP işçileri 9 kat azaldı (54 → 6)
- ✅ Sistem çok daha hızlı tepki veriyor
Hala Sorunlu
- ⚠️ Route/Config cache hala YOK
- ⚠️ Segment'ler Cloudflare'den gelmiyor
- ⚠️ API hızı değişmedi (83ms)
v4 (13 Şubat) vs v6 (17 Şubat) Karşılaştırması
| Metrik | v4 (13 Şubat) | v6 (17 Şubat) | Değişim |
|---|---|---|---|
| Load Average | 17.36 | 1.61 | ↓ %91 |
| PHP Process | 54 | 6 | ↓ %89 |
| Redis Clients | 241 | 197 | ≈ Benzer |
| API Latency | 80-120ms | 83ms | → Sabit |
| Route/Config Cache | YOK | YOK | ! Aynı |
| CF Segment Cache | Belirsiz | MISS | ! Çalışmıyor |
| Throttle Limiti | - | 120/dk IP bazlı | YENİ BULGU |
1. IP Bazlı Throttle Sorunu
KRİTİK - DOĞRULANDI
Basit Anlatım:
Bir kapıdan dakikada 120 kişi geçebilir. Bir ofiste 10 kişi aynı anda müzik dinlerse, hepsi aynı kapıyı (IP) kullanıyor. Her biri dakikada 12+ parça isterse → Kapasite doldu, 429 hatası!
Etkilenen: Kurumsal ağlar, internet kafeler, üniversiteler, paylaşımlı WiFi
Teknik Doğrulama:
// MuzibuServiceProvider.php - Satır 313 Route::middleware([ InitializeTenancyByDomain::class, 'throttle:120,1', // 120 req/min PER IP ]) ->match(['get', 'options'], '/hls/muzibu/songs/{id}/{filename}', ...)
Hesaplama:
- • Segment süresi: ~10 saniye
- • 1 şarkı = 20-30 segment
- • 1 kullanıcı/dk ≈ 6-10 istek
- • 15 kullanıcı = 90-150 istek/dk
Sonuç:
- • 120 limit aşılır → 429
- • Buffer boşalır
- • DONMA!
Çözüm:
'throttle:300,1' // veya 'throttle.user:stream' (user bazlı)
Player Donma Sorunu - Detaylı Analiz
Basit Anlatım
Player neden donuyor?
Şarkı çalarken player sürekli internetten yeni parçalar indiriyor. Eğer yeni parça gelmeden eski parça biterse → DONMA!
Normal Durum
Buffer hep dolu kalıyor.
Donma Durumu
Buffer boşaldı → STOP!
Neden yeni parçalar yavaş geliyor?
- • Sunucu her parça için Laravel'den geçiyor (yavaş)
- • IP throttle 120/dk limiti (yeni bulgu!)
- • Cloudflare cache çalışmıyor
- • İmza süresi dolmuş olabilir (60 dk)
Teknik Detay - HLS Player Yapısı
Muzibu, HLS (HTTP Live Streaming) kullanıyor. Şarkılar 10 saniyelik parçalara (segment) bölünmüş:
# playlist.m3u8 örneği #EXTM3U #EXT-X-VERSION:3 #EXT-X-TARGETDURATION:10 ← Her segment 10 saniye #EXT-X-KEY:METHOD=AES-128,URI="..." ← Şifreli #EXTINF:10.005333, segment-000.ts ← ~350KB #EXTINF:9.994667, segment-001.ts ...
HLS.js Buffer Ayarları:
maxBufferLength: 150 // saniye maxMaxBufferLength: 250 maxBufferSize: 200MB maxBufferHole: 2.5 // saniye
✅ Ayarlar optimal
Segment Akışı:
Donma Senaryosu:
- 1. segment-002.ts indiriliyor (350KB)
- 2. Sunucu yavaş veya 429 → 3+ saniye sürüyor
- 3. segment-001.ts biterken 002 henüz gelmedi
- 4. Buffer boş → DONMA!
Sunucu Tarafı Sorunlar
Route ve Config Cache YOK!
KRİTİKBasit:
Her kitap istediğinde görevli tüm rafları baştan sayıyor. Cache olsa? Kitapların listesi hazır, direkt alıyor.
# bootstrap/cache/ içeriği (17 Şubat) modules.php ✓ packages.php ✓ services.php ✓ config.php ✗ YOK! routes-v7.php ✗ YOK!
Etki: Her istek için +30-50ms
OPcache Durumu Şüpheli
KONTROLBasit:
Bir aşçı her sipariş için tarifi baştan okuyor. OPcache = Tarifleri ezberlemek.
# php.ini ;zend_extension=opcache ← Yorum! ;opcache.enable=1 ← Yorum!
Plesk'ten aktif olabilir ama doğrulanmalı.
Her İstek İçin 6 Middleware
OVERHEADBasit:
Bir odaya girmek için 6 kapıdan geçiyorsun. Her kapıda güvenlik soruyor.
API isteği → 1. EnsureFrontendRequestsAreStateful 2. InitializeTenancy ← DB switch! 3. SubstituteBindings 4. DatabasePoolMiddleware 5. ResourceTrackingMiddleware 6. Throttle → Sonuç: {"pong": true}
HLS Streaming Sistemi
Basit Anlatım - Nasıl Çalışıyor?
1. Playlist İste
Parça listesini al
Token gerekli ✓
2. Segment İndir
10sn'lik parçaları al
Token YOK (cache)
3. Key Al
Şifre çözme anahtarı
Token gerekli ✓
Güvenlik: AES-128 Şifreleme
Segment'ler şifreli. Key olmadan çalışmaz. Bu sayede segment public olsa bile güvenli.
Segment Yapısı:
- • Süre: 10 saniye
- • Boyut: ~350KB
- • Format: MPEG-TS (.ts)
- • Şifreleme: AES-128
- • Toplam: ~34,000 şarkı
Serve Yapısı:
- • Playlist: Laravel + Token
- • Segment: Laravel (şu an)
- • Key: Laravel + Token
- • Cache Header: 1 yıl (immutable)
Potansiyel Sorun:
Segment'ler Laravel üzerinden serve ediliyor. Her segment için PHP bootstrap + middleware çalışıyor. İdeal: Nginx direkt serve + Cloudflare cache.
Çoklu Error Listener Karmaşıklığı
DOĞRULANDI
Basit:
Bir hata olduğunda 5 farklı "bekçi" aynı anda tepki veriyor. Bazen birbirlerinin işine karışabilirler.
// player-core.js - Hls.Events.ERROR listener'ları Satır 2201: this.hlsNext.on(ERROR, ...) // Sonraki şarkı Satır 3790: preloadedHls.on(ERROR, ...) // Preload Satır 4603: this.hls.on(ERROR, ...) // ANA - 1. listener Satır 4786: this.hls.on(ERROR, ...) // ANA - 2. listener! Satır 6879: hlsPreload.on(ERROR, ...) // Preload ⚠️ Aynı HLS instance'ında 2 farklı ERROR listener!
Risk:
- • İki listener farklı tepki verebilir (race condition)
- • Biri refresh yaparken diğeri fallback yapabilir
- • State sync bozulabilir
Cloudflare Pro Optimizasyonu
Şu an (MISS)
🇹🇷 Kullanıcı şarkı açıyor...
→ CF: "Bende yok, sunucudan alayım"
→ +100ms gecikme!
Olması gereken (HIT)
🇹🇷 Kullanıcı şarkı açıyor...
→ CF: "Bende var, hemen veriyorum!"
→ 10ms'de teslim!
✓ Cache'lenmeli
- • segment-*.ts
- • JS/CSS
- • Görseller
✗ Cache'lenmemeli
- • playlist.m3u8
- • enc.bin (key)
- • API cevapları
⚠️ Kontrol
- • WAF/Rate Limit
- • www vs non-www
- • POP dağılımı
# Önerilen Page Rules www.muzibu.com/hls/song/*/segment-*.ts Cache Level: Cache Everything Edge TTL: 1 month Browser TTL: 1 year
Birleşik Aksiyon Planı (v1-v6)
| # | Çözüm | Durum | Etki | Risk |
|---|---|---|---|---|
| 1 | Throttle limitini artır (300/dk veya user-based) | BEKLEMEDE | Donma azalır | Düşük |
| 2 | Route & Config Cache aktifle | BEKLEMEDE | -30-50ms | Düşük |
| 3 | Cloudflare Segment Cache (Page Rule) | MISS | Donma azalır | Düşük |
| 4 | ERROR listener'ları konsolide et | ÖNERİ | Stabilite | Orta |
| 5 | Sunucu yükü | ✓ DÜZELDİ | Load %91 ↓ | - |
| 6 | HLS Buffer ayarları | ✓ OPTİMAL | - | - |
HEMEN Yapılması Gerekenler
1. Throttle Artır
'throttle:300,1' // veya 'throttle.user:stream'
2. Laravel Cache
php artisan config:cache php artisan route:cache