"Gecikme" Tam Olarak Ne Demek?
Basit Anlatım (Herkes İçin)
Gecikme = Bir şey isteyip cevap almanın ne kadar sürdüğü.
Örnek düşün:
Sen
"Merhaba!" dersin
Yol
Sesin gidiyor
Sunucu
Duyuyor, düşünüyor
Cevap
"Merhaba!" geliyor
Sorun: Sunucu çok yavaş "düşünüyor"!
Sen ne kadar hızlı internet kullanırsan kullan, sunucu yavaşsa beklersin. Tıpkı hızlı koşsan bile karşındaki kişi yavaş cevap veriyorsa beklediğin gibi.
Teknik Detay (Geliştiriciler İçin)
System Check sayfasında "Gecikme" testi şu JavaScript koduyla yapılıyor:
// alpine-apps.js satır 841-849 const latencies = []; for (let i = 0; i < 5; i++) { const start = performance.now(); await fetch('/api/muzibu/ping?t=' + Date.now(), { method: 'HEAD', cache: 'no-store' }); latencies.push(performance.now() - start); } this.latencyMs = Math.round(latencies.reduce((a, b) => a + b, 0) / latencies.length);
Ne yapıyor?
- • 5 kez
/api/muzibu/pingendpoint'ine istek atıyor - • Her isteğin ne kadar sürdüğünü ölçüyor
- • 5 ölçümün ortalamasını alıyor
- • Sonucu "Gecikme" olarak gösteriyor
Bu süre neleri içeriyor?
- • DNS çözümleme (~2ms)
- • TCP bağlantı kurma (~7ms)
- • SSL/TLS el sıkışma (~23ms)
- • Laravel işleme (~40-60ms)
- • Kullanıcı network gecikmesi (değişken)
Kritik Nokta:
/api/muzibu/ping bir Laravel route'u.
Yani basit bir "pong" cevabı için bile Laravel'in tüm middleware zinciri çalışıyor.
Bu da minimum 80-120ms demek - kullanıcının interneti ne kadar hızlı olursa olsun!
Route ve Config Cache YOK!
KRİTİK - EN BÜYÜK SORUNBasit Anlatım
Bir restoran düşün:
Cache YOKKEN (Şu anki durum)
Her müşteri geldiğinde garson:
- 📋 Menüyü baştan yazıyor
- 📋 Fiyatları tek tek hesaplıyor
- 📋 Malzemeleri sayıyor
- ⏰ Her seferinde 30-50 saniye kaybediyor!
Cache VARKEN (Olması gereken)
Garson sabah bir kere hazırlık yapıyor:
- ✅ Menü hazır, basılı
- ✅ Fiyatlar belirli
- ✅ Her şey düzenli
- ⚡ Müşteriye anında hizmet!
Yani şu an olan:
Her kullanıcı siteye girdiğinde, sistem "hangi sayfalar var, ayarlar ne" diye baştan hesaplıyor. Bu gereksiz yere 30-50ms kaybettiriyor.
Teknik Detay
Laravel'de bootstrap/cache/ klasörü kontrol edildi:
# ls -la bootstrap/cache/ modules.php ✓ VAR (4.4 KB) packages.php ✓ VAR (6.5 KB) services.php ✓ VAR (27.9 KB) config.php ✗ YOK! ← Tüm config dosyaları her request'te okunuyor routes.php ✗ YOK! ← Tüm route dosyaları her request'te parse ediliyor
Cache yokken ne oluyor?
- •
config/*.php→ ~30 dosya okunuyor - •
routes/*.php→ ~10 dosya parse ediliyor - •
Modules/*/routes/*.php→ ~50+ dosya - • Her dosya için disk I/O + PHP parse
- = Her request'te +30-50ms!
Cache varken ne oluyor?
- •
config.php→ TEK dosya, serialize edilmiş - •
routes.php→ TEK dosya, derlenmiş - • Disk I/O minimal
- • PHP parse yok, direkt yükleme
- = ~5ms'de tamamlanır!
Çözüm Komutları (Bakım zamanı için):
php artisan config:cache # Config'i tek dosyaya derle php artisan route:cache # Route'ları tek dosyaya derle
⚠️ Not: Route cache aktifken Route::... içinde closure kullanamazsın,
controller method'larına taşınmalı.
Basit Ping İçin 6 Middleware Çalışıyor!
YÜKSEK ETKİBasit Anlatım
Bir kapıdan geçmek istiyorsun:
Güvenlik 1: "Kim bu?"
Sanctum - Giriş yapmış mı kontrol ediyor
Güvenlik 2: "Hangi şirketten?"
Tenant - Hangi site olduğunu belirliyor (database değiştiriyor!)
Güvenlik 3: "Ne istiyor?"
SubstituteBindings - URL'deki ID'leri objelere çeviriyor
Güvenlik 4: "Veritabanı bağlantısı"
DatabasePool - Connection havuzunu yönetiyor
Güvenlik 5: "İstatistik tutalım"
ResourceTracking - Sistem kaynaklarını izliyor
Güvenlik 6: "Çok mu sık geliyor?"
Throttle - Rate limiting kontrolü
Sorun ne?
Sadece "pong" demek için 6 kapıdan geçiyoruz! Her kapı 5-10ms sürüyor. Toplamda 30-60ms sadece kapılar için!
Teknik Detay
/api/muzibu/ping route'una istek geldiğinde çalışan middleware zinciri:
// bootstrap/app.php - API middleware grubu $middleware->group('api', [ \Laravel\Sanctum\Http\Middleware\EnsureFrontendRequestsAreStateful::class, \App\Http\Middleware\InitializeTenancy::class, // ← DB switch! \Illuminate\Routing\Middleware\SubstituteBindings::class, ]); // Ayrıca global olarak eklenen: DatabasePoolMiddleware::class // ← Connection pool ResourceTrackingMiddleware::class // ← İzleme // Route-specific: ->middleware('throttle:120,1') // ← Rate limiting // Ping route'un kendisi: Route::get('/ping', fn() => response()->json(['pong' => true])) // Sonuç: {"pong": true} için 6 middleware + Laravel bootstrap!
Neden bu kadar middleware var?
Çünkü ping route'u /api/muzibu/ prefix'i altında.
Bu prefix'e gelen TÜM istekler için bu middleware'ler çalışıyor.
Ping endpoint'i ayrıcalıklı değil, normal bir API route'u gibi muamele görüyor.
54 PHP Process %100 CPU Kullanıyor!
PERFORMANS SORUNUBasit Anlatım
Bir fabrika düşün:
Normal Durum
- 👷 50 işçi var
- 📊 Ortalama %30-50 meşgul
- 😊 Yeni iş gelince hemen başlıyorlar
- ✅ Sistem rahat çalışıyor
Şu Anki Durum
- 👷 54 işçi var
- 📊 Çoğu %100 meşgul!
- 😰 Yeni iş gelince sıra bekliyor
- ❌ Sistem zorlanıyor
Ne anlama geliyor?
Sunucuda 54 PHP işçisi (process) var ve çoğu son hızda çalışıyor. Yeni bir istek geldiğinde boş işçi bulmak zorlaşıyor, bu da bekleme süresi demek.
Teknik Detay
top komutunun çıktısı:
top - 16:29:24 up 36 days Load average: 17.36, 12.32, 10.71 ← 72 çekirdek için yüksek! Tasks: 1051 total, 14 running PID USER %CPU COMMAND 2795609 tuufi.c+ 100.0 lsphp ← %100! 2795584 tuufi.c+ 100.0 lsphp ← %100! 2787971 tuufi.c+ 100.0 lsphp ← %100! 2791507 tuufi.c+ 100.0 lsphp ← %100! 2802518 tuufi.c+ 100.0 lsphp ← %100! 2802749 tuufi.c+ 100.0 lsphp ← %100! ... (toplam 54 lsphp process)
Sunucu CPU
72
çekirdek
Load Average
17.36
son 1 dakika
Aktif PHP
54
lsphp process
lsphp nedir?
lsphp = LiteSpeed PHP. Sunucu LiteSpeed web server kullanıyor ve her PHP isteği için bir lsphp process'i çalışıyor. Bu process'lerin çoğu %100 CPU kullanıyorsa, ya çok yoğun trafik var ya da PHP kodları verimsiz çalışıyor (örn: cache yok!).
241 Redis Client Bağlı
İZLENMELİBasit Anlatım
Redis = Süper hızlı not defteri
Redis, sık kullanılan bilgileri hafızada tutan bir sistem. Veritabanına gitmek yerine Redis'e bakıyoruz - çok daha hızlı!
Şu anki durum:
241
Bağlı kullanıcı
1305
İşlem/saniye
446MB
Kullanılan bellek
2MB/s
Veri çıkışı
241 bağlantı normal mi?
54 PHP process var ama 241 Redis bağlantısı var. Bu, her PHP process'in 4-5 Redis bağlantısı açtığı anlamına gelebilir. Connection pooling kontrol edilmeli.
Teknik Detay
# redis-cli INFO connected_clients:241 used_memory_human:446.13M instantaneous_ops_per_sec:1305 instantaneous_input_kbps:427.09 instantaneous_output_kbps:2037.82
Neden önemli?
Her Redis bağlantısı kaynak tüketir. 54 PHP process için 241 bağlantı demek, her process ortalama 4-5 bağlantı açıyor. Bu genellikle:
- • Cache için bir bağlantı
- • Session için bir bağlantı
- • Queue için bir bağlantı
- • Broadcasting için bir bağlantı
Persistent connection veya connection pooling ile azaltılabilir.
OPcache Durumu Şüpheli
KONTROL GEREKLİBasit Anlatım
OPcache = PHP'nin "ezberlemesi"
OPcache KAPALI
Her istek geldiğinde:
- 📖 PHP dosyasını oku
- 🔍 Kodu analiz et (parse)
- ⚙️ Makine diline çevir (compile)
- ▶️ Sonra çalıştır
- = Her seferinde aynı iş!
OPcache AÇIK
İlk seferde:
- 📖 PHP dosyasını oku
- ⚙️ Derle ve HAFIZADA TUT
- 💾 Sonraki isteklerde direkt çalıştır
- = Çok daha hızlı!
Neden şüpheli?
PHP config dosyasında OPcache satırları yorum satırı olarak görünüyor (başında ; var). Ama Plesk üzerinden ayrı aktif edilmiş olabilir. Kesin doğrulama gerekiyor.
Teknik Detay
# /opt/plesk/php/8.3/etc/php.ini ;zend_extension=opcache ← Yorum satırı! [opcache] ;opcache.enable=1 ← Yorum satırı! ;opcache.enable_cli=0 ← Yorum satırı! ;opcache.memory_consumption=128 ;opcache.interned_strings_buffer=8 ;opcache.max_accelerated_files=10000
Doğrulama gerekiyor:
Plesk, PHP ayarlarını farklı bir yerde override edebilir.
phpinfo() veya
php -i | grep opcache ile
gerçek durumu kontrol etmek gerekiyor.
Sonuç: Ne Yapılmalı?
| # | Sorun | Etki | Çözüm | Risk |
|---|---|---|---|---|
| 1 | Route/Config Cache Yok | +30-50ms | config:cache, route:cache | Orta |
| 2 | Çok Middleware | +30-60ms | Eşikleri güncelle (dürüst çözüm) | Düşük |
| 3 | Yüksek CPU (lsphp) | Genel yavaşlık | Cache aktifle, kodu optimize et | Orta |
| 4 | 241 Redis Client | Kaynak tüketimi | Persistent connection kontrol et | İzle |
| 5 | OPcache Şüpheli | ? | phpinfo() ile doğrula | Kontrol |
Hemen Yapılabilir (Düşük Risk)
- Gecikme eşiklerini gerçekçi yap (150/250/400ms)
- Bar gösterim formülünü güncelle
Bu değişiklikler sadece görsel - backend'e dokunmuyor.
Bakım Gerektirir
- Route ve config cache aktifle
- OPcache durumunu doğrula ve aktifle
- Redis connection pooling incele
Bu değişiklikler sunucuyu etkiler - bakım penceresi gerekir.
Not: Bu rapor sadece araştırma içerir. Hiçbir değişiklik yapılmamıştır. Tüm sistemler olduğu gibi çalışmaya devam ediyor.