Laraavel ile ölçeklenebilir web uygulamaları geliştirme konusunda 10 yılı aşkın bir tecrübem var. Bu süre zarfında öğrendim ki, performans optimizasyonu aceleye getirilmiş bir optimizasyon değil, hangi mücadelelerin verileceğini bilmekle ilgilidir.
Halen federal hükümet sisteminin (CAPES) geliştirme sürecini yönetiyorum ve binlerce eşzamanlı kullanıcıyı işleyen Laravel uygulamalarını optimize etmek zorunda kaldım. İşte başladığımda bilseydim, en önemli performans ipuçları.
1. Eager Loading: N+1 Sorgu Canavarı ile Baş Et
Laravel kod tabanlarında gördüğüm en büyük performans düşürücü şunlardır:
// KÖTÜ: N+1 sorguları
$posts = Post::all();
foreach ($posts as $post) {
echo $post->user->name; // HER bir gönderi için sorgu çalıştırılıyor
}
// İYİ: Toplam 2 sorgu
$posts = Post::with('user')->get();
foreach ($posts as $post) {
echo $post->user->name;
}
Etki: Gerçek bir projede sorgu sayısını 1,001’den 2’ye düşürdü.
2. Veritabanı İndeksleme: Sessiz Performans Artıcısı
Filtreleme veya birleştirme yaptığınız sütunlara indeks ekleyin:
Schema::table('posts', function (Blueprint $table) {
$table->index('user_id');
$table->index('status');
$table->index(['category_id', 'published_at']); // Kompozit indeks
});
Pro ipucu: Kaybolan indeksleri tespit etmek için MySQL’de EXPLAIN kullanın.
3. Pahalı İşlemleri Önbelleğe Alın
// Veritabanı sorgularını önbelleğe al
$users = Cache::remember('active_users', 3600, function () {
return User::where('active', true)->get();
});
// Hesaplanan değerleri önbelleğe al
$stats = Cache::remember('dashboard_stats', 600, function () {
return [
'total_users' => User::count(),
'active_sessions' => Session::where('active', true)->count(),
];
});
Prodüksiyonda: Bu, kontrol paneli yükleme süresini 2.3 saniyeden 180 ms’ye düşürdü.
4. Redis Kullanın: Oturumlar ve Önbellek İçin
// config/database.php
'redis' => [
'client' => 'phpredis', // phpredis uzantısını kullanın, predis değil
'cluster' => false,
'default' => [
'host' => env('REDIS_HOST', '127.0.0.1'),
'password' => env('REDIS_PASSWORD', null),
'port' => env('REDIS_PORT', 6379),
'database' => 0,
],
],
Neden Redis? Bellek tabanlı depolama = Veritabanı oturumlarından 10-100 kat daha hızlı.
5. Eloquent’i Optimize Edin: Sadece İhtiyacınız Olanı Seçin
// KÖTÜ: Tüm sütunları çeker
$users = User::all();
// İYİ: Belirli sütunları seç
$users = User::select('id', 'name', 'email')->get();
// DAHA İYİ: Tek sütun için pluck kullanın
$emails = User::pluck('email');
6. Ağırlıklı İşlemleri Kuyruğa Alın
Kullanıcıların e-postalar, bildirimler veya dosya işlemleri için bekletilmesini istemiyoruz:
// Kuyruğa ekle
ProcessVideoUpload::dispatch($video);
SendWelcomeEmail::dispatch($user);
// İşleri zincirleyin
ProcessOrder::withChain([
new SendInvoice($order),
new UpdateInventory($order),
])->dispatch($order);
Sonuç: Sayfa yanıt süresi 4 saniyeden 300 ms’ye düştü.
7. Composer ile Otomatik Yükleyiciyi Optimize Edin
composer dump-autoload --optimize
composer install --optimize-autoloader --no-dev
Prodüksiyonda: Her zaman optimizasyon bayraklarıyla çalıştırın.
8. Prodüksiyonda OPcache’i Etkinleştirin
; php.ini
opcache.enable=1
opcache.memory_consumption=256
opcache.interned_strings_buffer=16
opcache.max_accelerated_files=10000
opcache.validate_timestamps=0 # Prodüksiyonda devre dışı bırak
opcache.revalidate_freq=0
Etki: Ücretsiz olarak %30-50 performans artışı sağladı.
9. Büyük Veri Setleri için Chunk Kullanın
// KÖTÜ: 100k kaydı belleğe yükler
User::where('active', true)->get()->each(function ($user) {
// Kullanıcıyı işleyin
});
// İYİ: Parçalar halinde işleyin
User::where('active', true)->chunk(200, function ($users) {
foreach ($users as $user) {
// Kullanıcıyı işleyin
}
});
10. Laravel Telescope ve Horizon ile İzleme
Geliştirme sırasında darboğazları belirlemek için kurun:
composer require laravel/telescope --dev
composer require laravel/horizon
Telescope: Aşağıdakileri gösterir:
- Yavaş sorgular
- Hafıza kullanımı
- İstek süresi
- N+1 sorgu problemleri
Bonus: Prodüksiyon Kontrol Listesi
- OPcache’i etkinleştir
- Önbellek/oturumlar için Redis kullanın
php artisan config:cacheçalıştırınphp artisan route:cacheçalıştırınphp artisan view:cacheçalıştırın- Varlıklar için CDN kullanın
- GZIP sıkıştırmasını etkinleştirin
- Veritabanı bağlantı havuzlaması
Yüksek Performanslı Laravel Uygulamaları İçin Teknolojim
Yıllarca süren optimizasyonlardan sonra önerilerim:
- Web Sunucusu: Nginx + PHP-FPM
- Önbellek: Redis (phpredis uzantısı ile)
- Veritabanı: Uygun indekslerle PostgreSQL
- Kuyruk: Karmaşık iş akışları için Redis veya RabbitMQ
- İzleme: Laravel Telescope + Horizon + New Relic
Sonuç
Performans optimizasyonu bir yolculuktur, varış noktası değil. Kolaydan zora giden adımlarla başlayın (eager loading, indeksleme, önbellekleme) ve etkisini ölçün.
CAPES federal sisteminde gerçekleştirdiğimiz bu optimizasyonlar, yanıt sürelerini 3-5 saniyeden 200 ms’nin altına düşürdü ve binlerce eşzamanlı kullanıcıyı sorunsuz bir şekilde işledi.
En iyi Laravel performans ipucunuz nedir? Yorumlarda paylaşın!
10 yılı aşkın süredir ölçeklenebilir Laravel uygulamaları geliştiriyor | Şu anda: CAPES’te Kıdemli PHP/Laravel Geliştiricisi | Danışmanlık ve mimari incelemeler için mevcut
Kaynak: Orijinal Makale
- 1. Eager Loading: N+1 Sorgu Canavarı ile Baş Et
- 2. Veritabanı İndeksleme: Sessiz Performans Artıcısı
- 3. Pahalı İşlemleri Önbelleğe Alın
- 4. Redis Kullanın: Oturumlar ve Önbellek İçin
- 5. Eloquent’i Optimize Edin: Sadece İhtiyacınız Olanı Seçin
- 6. Ağırlıklı İşlemleri Kuyruğa Alın
- 7. Composer ile Otomatik Yükleyiciyi Optimize Edin
- 8. Prodüksiyonda OPcache’i Etkinleştirin
- 9. Büyük Veri Setleri için Chunk Kullanın
- 10. Laravel Telescope ve Horizon ile İzleme
- Bonus: Prodüksiyon Kontrol Listesi
- Yüksek Performanslı Laravel Uygulamaları İçin Teknolojim
- Sonuç


