Kalıcı Bellek Tuzağı
Geleneksel PHP, sona ermek üzere tasarlanmıştır. Smart Tech Devs’te, standart bir Laravel isteği başlatılır, framework çalıştırılır, mantık işlenir, bir yanıt döner ve ardından tamamen yok edilir; böylece tüm RAM temizlenir. Bu “paylaşımsız” mimari, PHP’yi son derece stabil hale getirir, ancak her istekte 30MB’lık framework’ün başlatılması, saniyede yaklaşık 200 istekle sınırlı kalmanıza neden olur.
Kurumsal düzeyde (saniyede binlerce istek) ölçeklenmek için Laravel Octane‘ı dağıtırsınız (Swoole veya RoadRunner kullanarak). Octane uygulamanızı bir kez başlatır, RAM’de canlı tutar ve gelen istekleri sürekli işçi üzerinden geçirir. Ancak bu, korkutucu bir yeni zafiyet olan Bellek Sızıntıları ile gelmektedir. Eğer Request 1’de bir statik diziye veri eklerseniz ya da kullanıcıya özgü verileri bir Singleton’a bağlarsanız, o veri Request 2’de hala RAM’de kalır. Sonunda, sunucunuz bellekten tükenir ve şiddetle çökebilir.
Çözüm: Durumsuz Mimari
Kalıcı bir Octane ortamında hayatta kalmak için, kodunuzu mükemmel bir şekilde durumsuz olacak şekilde tasarlamalısınız. İstek yaşam döngüsü verilerini tutmak için statik özelliklere güvenemezsiniz ve Laravel’in Servis Kapı’nın birden fazla istek üzerindeki bağımlılıkları nasıl yönettiğini anlamalısınız.
Güvenli Singleton’lar Oluşturma
Klasik bir bellek sızıntısına sahip özel bir analiz hizmetine bakalım ve durumu uygulama örneğinden nasıl ayıracağımızı inceleyelim.
namespace App\Services;
class UserActivityTracker
{
// ❌ ANTI-PATTERN: Bellek Sızıntısı
// Octane'de, bu statik dizi ASLA temizlenmez.
// 10,000 istekten sonra, bu dizi tüm sunucu RAM'ini tüketir.
public static array $trackedEvents = [];
public function recordEvent(string $event)
{
self::$trackedEvents[] = $event;
}
// ✅ GİRİŞİM MODELİ: İstek-Scoped Durum
// Statik özelliği kaldırıyoruz. Bunun yerine, Laravel'in dahili önbellekleme
// veya Octane'in otomatik olarak temizleyebileceği istek-eşli örnekleri kullanıyoruz.
private array $events = [];
public function recordSafeEvent(string $event)
{
$this->events[] = $event;
}
// Octane'e bu servisi her istektan sonra temizlemesini açıkça söylüyoruz.
public function flush()
{
$this->events = [];
}
}
Adım 2: Octane Temizleme Dinleyicilerini Bağlama
Eğer geçici durumu tutan servisleriniz varsa, bunları octane.php yapılandırma dosyanızda kaydetmelisiniz, böylece framework, HTTP yanıtı gönderildikten sonra bunları temizlemeyi bilir.
// config/octane.php
'listeners' => [
RequestTerminated::class => [
// Temel framework durumunu temizle
FlushLogContext::class,
// Özel iş hizmetimizi otomatik olarak temizle!
function () {
app(\App\Services\UserActivityTracker::class)->flush();
},
],
],
Mühendislik Yatırım Getirisi (ROI)
Katı, durumsuz mimarilere geçiş yaparak, Laravel Octane’ın gerçek gücünü açığa çıkarırsınız. Framework başlatma cezasını atlayarak, API verimliliğinizi 10 kat artırır ve uzun süreli işçilerinizin, sürekli kurumsal trafik altında kritik bellek sızıntılarına maruz kalmadan çalışacağından matematiksel olarak emin olursunuz.
Kaynak: Orijinal Makale


