· kaynak dev.to (home feed)
Symfony 8, servis oluşturmayı ertelemek için PHP 8.4'ün native lazy objelerine yaslanıyor
dev.to'daki bir anlatım, PHP 8.4'ün native lazy objelerinin Symfony 8'e container servislerini boş kabuklar olarak kaydetme imkânı verdiğini; constructor'ları erteleyerek servis yoğun uygulamalarda boot süresini iddiaya göre %15–25 kısalttığını açıklıyor.
Lazy objeler PHP 8.4'te bir dil primitifi haline geliyor
dev.to'daki bir yazıya göre temel değişiklik, PHP 8.4'ün lazy objeleri native bir dil özelliği olarak getirmesi. Bir lazy obje oluşturulduğu andan itibaren var olur; ancak constructor'ı çalışmaz ve bağımlılıkları, ilk gerçek etkileşime — bir property okunmasına ya da objenin durumuna dokunan bir metod çağrısına kadar — çözülmez.
Desen PHP için yeni değil. Yazıda belirtildiği üzere Doctrine yıllardır entity'ler için dinamik olarak üretilen proxy'ler kullanıyor ve Symfony daha önce lazy loading'i LazyGhostTrait ve dependency injection container tarafından runtime'da üretilen proxy sınıflarıyla uyguluyordu. 8.4 ile değişen şey bu işi kimin yaptığı: PHP runtime artık lazy başlatmayı kendisi, kod üretimi veya introspection yükü olmadan hallediyor.
Symfony 8 container'ını nasıl yeniden bağlıyor
Symfony'nin dependency injection container'ı framework'ün kalbi; router, template engine, security, repository'ler gibi yüzlerce servisi kaydederken tek bir HTTP isteği bunların yalnızca küçük bir kısmını kullanıyor. Yazıya göre hepsini boot sırasında oluşturmak boşa harcanan iş.
Symfony 8 ile container'daki servisler native PHP 8.4 lazy objeleri olarak oluşturuluyor. Container her servisi kaydediyor, ancak o servisin constructor'ı yalnızca bir metodu ya da property'si gerçekten çağrıldığında çalışıyor. Boot boş kabuklar üretiyor; gerçek başlatma maliyeti istek yaşam döngüsüne yayılıyor ve yalnızca gerçekten kullanılan servisler için ödeniyor.
İkinci bir sonuç da üretilen proxy'lerin kaldırılması. PHP 8.4'ten önce Symfony runtime'da proxy sınıfları üretiyor, bunları cache dizininde saklıyor ve autoloader üzerinden yüklüyordu. Bu yaklaşım işe yarıyordu ama ölçülebilir maliyetleri vardı: ilk çalıştırmada kod üretimi, cache I/O ve autoloader yükü. Yazıya göre native lazy objelerle bu yük tamamen ortadan kalkıyor — ek sınıflar yok, proxy cache dosyaları yok, autoloader yok.
Bildirilen performans rakamları
Rakamlar resmi bir benchmark paketinden değil, yazının yazarından geliyor. 200'den fazla kayıtlı servisi bulunan tipik bir Symfony uygulamasının boot süresinde %15–25 aralığında iyileşme gördüğü, Sonata veya EasyAdmin gibi ağır bundle'lar üzerine kurulu uygulamalarda kazancın daha da büyük olabileceği belirtiliyor. Yazar ayrıca cold start süresinin kritik olduğu serverless ortamları ve sık ölçeklenen container'ları, iyileşmenin en doğrudan operasyonel tasarrufa dönüştüğü durumlar olarak gösteriyor.
Karışımdaki iki diğer PHP 8.4 özelliği
Yazı, Symfony 8'in benimsediğini söylediği iki ilgili özelliği daha anlatıyor.
Property hook'lar, mantığı doğrudan property bildiriminin içinde property okuma ve yazmalarına bağlıyor. __get ve __set magic metodlarının aksine tipli, deklaratiftirler ve runtime tarafından native olarak ele alınırlar. Yazıya göre Symfony 8 bunları çeşitli bileşenlerde kullanıyor: Form veri transformer'ları bir formun arkasındaki DTO'nun property'lerinde hook olarak bildirilebiliyor, Serializer normalizasyon mantığı obje property'leriyle birlikte konumlandırılabiliyor, Validator set-hook'ları constraint sistemini tamamlayan satır içi kontroller uygulayabiliyor ve Doctrine entity'leri property değerlerini ayrı lifecycle event veya listener'lara ihtiyaç duymadan ön işleyebiliyor.
Asymmetric visibility, bir property'nin herkese açık okunur ama özel yazılır olmasını sağlıyor — örneğin public private(set) string $name — ve bu, içsel değiştirilebilirlik hâlâ gereken property'ler için boilerplate getter'ları ortadan kaldırıyor. Symfony 8'in bunu value object ve DTO'larda kullandığı bildiriliyor.
Neden önemli
Lazy obje değişikliği bu hikâyenin pratik çekirdeği: yaygın kullanılan bir deseni userland kod üretiminden dil runtime'ına taşıyor ve her isteğin içinden geçtiği bileşen olan Symfony container'ı, bunu uygulamak için en yüksek kaldıraçlı yer. Servis yoğun uygulamalar için daha hızlı boot, istek başına daha düşük yük demek; serverless veya autoscaling dağıtımlarında ise cold start'ları kısaltıyor ve bu doğrudan altyapı maliyetine yansıyor.
Dikkat edilmesi gereken nokta kaynak. %15–25 rakamı, serverless çerçevesi ve bileşen düzeyindeki property hook entegrasyonlarının tamamı tek bir dev.to blog yazısından geliyor. Değişikliğin yönü PHP 8.4'ün lazy objelerinin tasarım amacıyla tutarlı; ancak yükseltme düşünen ekipler rakamları yol gösterici olarak görmeli ve boot süresini kendi servis grafiklerinde ölçmelidir.
- #php
- #symfony
- #dependency-injection
- #performance
- #lazy-loading