· Admin

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.