Laravel Octane Nedir ve Ne Zaman İşe Yarar?
Laravel Octane, uygulamanızı geleneksel istek-başına-bootstrap modelinden çıkarıp uzun ömürlü bir uygulama sunucusu üzerinde çalıştırır. Klasik PHP-FPM modelinde her istek, framework'ün yeniden yüklenmesi, servis konteynerinin yeniden kurulması ve yapılandırmaların yeniden okunması anlamına gelir. Octane'de uygulama bir kez yüklenir, bellek içinde tutulur ve gelen istekler bu yüklü kopyaya yönlendirilir.
Bu mimari özellikle şu durumlarda belirgin kazanç sağlar:
- Yoğun trafik alan ve bootstrap maliyetinin toplam süreye oranının yüksek olduğu uygulamalar.
- Aynı süreçte birden fazla isteği karşılayarak CPU ve bellek yükünü azaltmak istediğiniz senaryolar.
- WebSocket, zamanlanmış işler veya uzun süreli bağlantılar gibi kalıcı süreç gerektiren işler.
Octane bir sihirli değnek değildir. Yanlış kullanıldığında bellek sızıntısı, istekler arası veri sızması ve beklenmedik durum paylaşımı gibi sorunlara yol açar. Bu rehber, bu riskleri yöneterek Octane'i sağlam biçimde devreye almanıza odaklanır.
Önkoşullar ve Sürüm Kapsamı
Octane, Laravel'in resmi paketidir ve Laravel 8 ve sonrası sürümlerle uyumludur. Bu rehberdeki kavramlar Laravel 10, 11 ve 12 için geçerlidir; sürüme özgü kırıcı değişiklikler için ilgili sürümün yükseltme notlarını ayrıca kontrol edin.
Gereksinimler:
- PHP 8.1 veya üzeri (kullandığınız Laravel sürümünün gerektirdiği minimum PHP sürümü esas alınmalıdır).
- Composer.
- Octane'in çalışacağı arka uç: Swoole veya RoadRunner. Swoole bir PHP eklentisidir; RoadRunner ise Go ile yazılmış ayrı bir ikili dosyadır.
Kurulum ve yapılandırma komutları sürüme göre küçük farklılıklar gösterebilir; bu yüzden komutları çalıştırmadan önce ilgili paket sürümünün dokümantasyonunu doğrulayın.
Kurulum
Octane'i Composer ile ekleyin:
composer require laravel/octane
Ardından kurulum sihirbazını çalıştırın:
php artisan octane:install
Bu komut, hangi uygulama sunucusunu (Swoole veya RoadRunner) kullanacağınızı sorar ve gerekli yapılandırma dosyasını (config/octane.php) oluşturur. Swoole seçtiyseniz PHP eklentisinin kurulu ve etkin olduğundan emin olun; RoadRunner seçtiyseniz ilgili ikili dosyanın indirilmesi gerekir.
Sunucuyu başlatmak için:
php artisan octane:start
Varsayılan olarak uygulama belirli bir port üzerinde dinlemeye başlar. Üretimde genellikle bu sürecin önüne Nginx gibi bir ters proxy konumlandırılır.
Uzun Ömürlü Süreç Modelinin Getirdiği Temel Kural
Octane'in tüm davranışını anlamak için tek bir kuralı içselleştirmek gerekir: uygulama bellekte yaşar, istekler bu yaşayan kopyaya uğrar. Bu, geleneksel PHP modelinde geçerli olan bazı varsayımları geçersiz kılar:
- Sınıf özelliklerinde tuttuğunuz durum, istekler arasında paylaşılabilir.
- Statik değişkenler ve global durum, istekler arasında taşınabilir.
- Servis konteynerine kaydedilen singleton'lar, tüm istekler boyunca aynı örneği döndürür.
Bu nedenle istekler arası veri sızması, Octane'de karşılaşacağınız en yaygın ve en tehlikeli hata sınıfıdır.
Durum Sızmasını Önleme
İstek Başına Sıfırlanması Gerekenler
Aşağıdaki durumlar istekler arasında taşınırsa hatalı davranışa yol açar:
- Kullanıcıya özel veriler (kimlik doğrulama, oturum).
- İstek nesnesine bağlı durumlar.
- Geçici hesaplama sonuçları.
Octane, istekler arasında sıfırlanması gereken servisleri config/octane.php içindeki warm ve flush listeleriyle yönetir. Kendi servislerinizi yazdıysanız ve bunlar istekler arası durum tutuyorsa, bunları uygun listeye ekleyin.
Singleton'lara Dikkat
Servis konteynerine singleton olarak kaydettiğiniz bir sınıf, tüm istekler boyunca aynı örneği paylaşır. Eğer bu sınıf isteğe özel veri tutuyorsa, bu veri bir sonraki isteğe sızar. Böyle bir sınıfı singleton yerine normal binding olarak kaydetmek veya her istekte durumu açıkça sıfırlamak gerekir.
Örnek olarak, isteğe özel veri tutan bir sınıfı düşünün:
class RequestContext
{
protected array $data = [];
public function set(string $key, mixed $value): void
{
$this->data[$key] = $value;
}
public function get(string $key, mixed $default = null): mixed
{
return $this->data[$key] ?? $default;
}
public function reset(): void
{
$this->data = [];
}
}
Bu sınıfı singleton olarak kaydederseniz, reset çağrılmadığı sürece data dizisi istekler arasında birikir. Çözüm ya singleton kaydını kaldırmak ya da her istek başında reset çağrılmasını sağlamaktır.
Yapılandırma Önbelleği ve Ortam Değişkenleri
Octane, uygulamayı başlattığında .env dosyasını okur. Süreç çalışırken .env dosyasında yaptığınız değişiklikler, sunucu yeniden başlatılmadıkça etkili olmaz. Üretimde yapılandırmayı önbelleğe almak için:
php artisan config:cache
Yapılandırma veya ortam değişkenlerini değiştirdikten sonra Octane sürecini yeniden başlatmanız gerekir. Bunu php artisan octane:reload ile yapabilirsiniz; bu komut çalışan worker'ları nazikçe yeniler.
Kod Değişikliklerinin Yansıması
Octane süreci uzun ömürlü olduğu için, kod dosyalarında yaptığınız değişiklikler çalışan sürece otomatik yansımaz. Geliştirme sırasında:
php artisan octane:start --watch
--watch seçeneği dosya değişikliklerini izler ve süreci yeniden yükler. Üretimde bu seçeneği kullanmayın; dağıtım sonrası octane:reload çağırmak yeterlidir.
Eşzamanlı Görevler
Octane, aynı istek içinde paralel iş yürütmek için yardımcılar sunar. Örneğin bağımsız görevleri eşzamanlı çalıştırmak için:
use Laravel\Octane\Facades\Octane;
[$users, $orders] = Octane::concurrently([
fn () => User::active()->get(),
fn () => Order::recent()->get(),
]);
Octane::concurrently verilen görevleri paralel yürütür ve sonuçları sırayla döndürür. Bu, birbirinden bağımsız ve gecikmeye duyarlı işlemlerde toplam süreyi kısaltır. Ancak bu görevlerin paylaşılan durumu değiştirmediğinden emin olun; paralel çalışan kodda yarış koşulları oluşabilir.
Yaygın Hatalar
1. İstekler arası durum sızması. En sık görülen sorundur. Singleton'lar, statik değişkenler ve global durum, isteğe özel veri tutuyorsa sızar. Her servis için "bu durum istekler arasında yaşamalı mı?" sorusunu sorun.
2. Bellek sızıntısı. Uzun ömürlü süreçte her istekte büyüyen diziler, önbellekler veya kapatılmayan kaynaklar zamanla belleği tüketir. Süreç belleğini izleyin ve gerektiğinde octane:reload ile yenileyin.
3. Yapılandırma değişikliklerinin yansımaması. .env veya yapılandırma dosyalarını değiştirdikten sonra süreci yeniden başlatmadığınızda eski değerler geçerli kalır.
4. Kod değişikliklerinin görünmemesi. Geliştirme sırasında --watch, üretimde octane:reload kullanmadan yapılan değişiklikler çalışan sürece yansımaz.
5. Dosya tabanlı oturum veya önbelleğin uygun olmaması. Çoklu worker ortamında paylaşılan durum için Redis gibi merkezi bir depo kullanmak daha güvenilirdir.
Güvenlik Etkileri
- Veri sızması en kritik risktir. Bir kullanıcının isteğine ait veri, yanlış yapılandırılmış bir singleton veya statik değişken üzerinden başka bir kullanıcıya ulaşabilir. Bu, yetkilendirme atlatmasına kadar varan sonuçlar doğurabilir. İstek başına sıfırlanması gereken tüm durumu dikkatle yönetin.
- Kimlik doğrulama ve oturum durumu istekler arasında taşınmamalıdır. İlgili servislerin doğru şekilde flush edildiğinden emin olun.
- Hata ayıklama bilgileri. Uzun ömürlü süreçte hata ayıklama çıktıları veya loglar birikebilir; üretimde hata ayıklama modunu kapalı tutun.
- Süreç izolasyonu. Worker'lar aynı bellek alanında çalıştığı için, bir istekte açılan kaynakların (dosya tanıtıcıları, bağlantılar) düzgün kapatıldığından emin olun.
Üretimde Çalıştırma
Üretimde Octane genellikle bir süreç yöneticisi (systemd, Supervisor) altında ve önünde bir ters proxy ile çalıştırılır. Ters proxy, statik dosyaları sunar ve dinamik istekleri Octane'e yönlendirir.
Dağıtım akışında tipik sıra şöyledir:
- Yeni kodu dağıtın.
- Bağımlılıkları güncelleyin ve yapılandırmayı önbelleğe alın.
php artisan octane:reloadile worker'ları nazikçe yenileyin.
octane:reload, çalışan istekleri kesmeden yeni worker'ları devreye alır; bu da sıfır kesintiyle dağıtım yapmanızı sağlar.
Worker sayısını ve diğer parametreleri octane:start seçenekleriyle veya yapılandırma dosyası üzerinden ayarlayabilirsiniz. Donanımınıza ve iş yükünüze göre bu değerleri ölçerek belirleyin; sabit bir "en iyi" değer yoktur.
Özet
Octane, uygulamayı bellekte tutarak bootstrap maliyetini ortadan kaldırır ve yüksek trafikli senaryolarda belirgin kazanç sağlar. Karşılığında, geleneksel PHP modelinde geçerli olan bazı varsayımları bırakmanız gerekir: durum artık istekler arasında yaşayabilir ve bu durumu doğru yönetmek size bağlıdır. Singleton'ları, statik değişkenleri ve isteğe özel verileri dikkatle ele alın; yapılandırma ve kod değişikliklerinden sonra süreci yenileyin; bellek kullanımını izleyin. Bu disiplini uyguladığınızda Octane, uygulamanızın performansını ölçülebilir biçimde artıran sağlam bir altyapı sunar.