Laravel Octane ile Performans Artışı: Swoole ve RoadRunner
Laravel projelerinde yüksek trafik ve düşük gecikme süresi istiyorsanız Laravel Octane ciddi bir fark yaratıyor. Swoole veya RoadRunner gibi uygulama sunucularını kullanarak istek başına framework başlatma maliyetini ortadan kaldırıyor.
Laravel Octane Nedir?
Geleneksel PHP-FPM modelinde her HTTP isteği için Laravel framework sıfırdan başlatılır: config yüklenir, service provider'lar register/boot edilir, middleware'ler çalışır. Bu her istekte tekrar eden maliyet, yüksek trafikte performans kaybına neden olur.
Octane bu döngüyü kırıyor. Uygulama bir kez boot edilir ve bellekte kalır. Sonraki istekler zaten hazır olan uygulamaya gelir.
Avantajları:
- İstek başına framework yeniden başlatılmaz
- Bellekte servisler ve singleton'lar tutulur
- Asenkron ve eş zamanlı işlem desteği
- WebSocket, Task Worker gibi özellikler
Kurulum
composer require laravel/octane
php artisan octane:install
Install sırasında Swoole veya RoadRunner seçmeniz istenir.
Swoole vs RoadRunner
| Özellik | Swoole | RoadRunner |
|---|---|---|
| Dil | C ile yazılmış PHP uzantısı | Go ile yazılmış |
| Asenkron | Tam destek | Kısıtlı |
| Kurulum | pecl install swoole |
Composer + Go binary |
| Performans | Çok yüksek | Yüksek |
| WebSocket | Evet | Hayır |
| Memory Leak Protection | Evet | Evet |
Kısa özet: Asenkron işlemler ve WebSocket istiyorsanız Swoole. Daha hafif ve taşınabilir bir yapı istiyorsanız RoadRunner.
Swoole ile Çalıştırma
Swoole kurulumu:
pecl install swoole
config/octane.php:
return [
'server' => env('OCTANE_SERVER', 'swoole'),
'workers' => env('OCTANE_WORKERS', 'auto'),
'max_requests' => env('OCTANE_MAX_REQUESTS', 500),
];
Başlatma:
php artisan octane:start --server=swoole --port=8000
RoadRunner ile Çalıştırma
composer require spiral/roadrunner-cli spiral/roadrunner-http --dev
php artisan octane:start --server=roadrunner --port=8000
Performans Karşılaştırması
Apache Benchmark ile test:
ab -n 10000 -c 100 http://127.0.0.1:8000/
| Yöntem | İstek/Saniye |
|---|---|
| PHP-FPM (Nginx) | ~500 |
| Octane + RoadRunner | ~2500 |
| Octane + Swoole | ~4000 |
5-10 kat performans artışı. Özellikle API servisleri ve yoğun trafikli projelerde ciddi fark yaratır.
Dikkat Edilmesi Gerekenler
Singleton ve Static State
Octane'da uygulama bellekte kaldığı için singleton'lar istekler arasında paylaşılır. Bu dikkatli yönetilmezse veri sızıntısına neden olabilir:
// YANLIŞ: Her istekte önceki kullanıcının verisi kalır
app()->singleton('cart', function () {
return new ShoppingCart();
});
// DOĞRU: Octane lifecycle hook'larıyla temizleyin
use Laravel\Octane\Facades\Octane;
Octane::booted(function () {
app()->singleton('cart', function () {
return new ShoppingCart();
});
});
Request ve Response Nesneleri
Global request() helper'ı dikkatli kullanın. Octane her istekte yeni request nesnesi oluşturur ama resolve timing'i önemli:
// Dependency injection tercih edin
public function index(Request $request)
{
return $request->user();
}
Octane ile Asenkron Görevler
use Laravel\Octane\Facades\Octane;
// Arka planda asenkron çalıştırma
Octane::concurrently([
fn () => User::count(),
fn () => Post::count(),
fn () => Order::sum('total'),
]);
Bu üç sorgu paralel çalışır ve toplam süre en yavaş sorgunun süresi kadar olur.
Octane Cache
Bellekte ultra hızlı cache:
// Octane cache'e yaz (bellekte, Redis'ten bile hızlı)
Octane::cache()->put('stats', $stats, 60);
// Oku
$stats = Octane::cache()->get('stats');
Bu cache sunucu restart'ında silinir. Kalıcı cache için Redis kullanmaya devam edin.
Production'da Octane
Supervisor ile Çalıştırma
[program:octane]
command=php /var/www/app/artisan octane:start --server=swoole --port=8000
user=www-data
autostart=true
autorestart=true
stopwaitsecs=10
Nginx Reverse Proxy
server {
listen 80;
server_name projeman.net;
location / {
proxy_pass http://127.0.0.1:8000;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
}
Graceful Restart
Deploy sonrası:
php artisan octane:reload
Bu komut mevcut istekleri tamamlar, sonra worker'ları yeniden başlatır. Downtime sıfır.
Ne Zaman Octane Kullanmalı?
Uygun:
- Yüksek trafikli API servisleri
- Gerçek zamanlı uygulamalar
- Milisaniye seviyesinde gecikme gereksinimi
Uygun değil:
- Shared hosting'deyseniz (root erişim gerekli)
- Küçük trafik, basit projeler (karmaşıklığa değmez)
- Legacy kod tabanı (singleton sorunları çıkabilir)
Sonuç
Laravel Octane performansı 5-10 kat artırabilir ama bedeli var: singleton yönetimi, static state dikkatli kullanımı ve farklı bir deployment yaklaşımı. Projenizin ihtiyacını doğru değerlendirip karar verin.