# Laravel'in preload eğrisi: 123 dosya, 1.912 dosyadan sekiz kat fazla kazandırıyor

> opcache ölçümü Laravel'i iki nokta arasında bırakmıştı: preload yok (76 ms) ve hepsini derle (14 ms, artı 2,3 saniye açılış). Bu kayıt aradaki eğriyi çıkarıyor.

- Tür: Ölçüm
- Soru: Laravel için elle seçilmiş bir preload nereye kadar iner, ve her dilim ne kadar açılış bedeline mal olur?
- Bulgu: Eğri hacimle orantılı değil. İlk 1.592 dosya (Laravel çekirdeği) 30 ms kazandırıyor ve açılışa 1,2 saniye ekliyor. Sonraki 1.094 Symfony dosyası 9,5 ms kazandırıyor, bedava. Ondan sonraki **123 dosya** (psr, carbon) 15,7 ms kazandırıyor — kendinden önceki 1.094 dosyadan fazla. Ve son 1.912 dosya yalnız 1,8 ms kazandırıp açılışa 1,2 saniye daha yazıyor. Yani önceki kaydın tavan olarak ölçtüğü "hepsini derle", eğrinin başlangıç noktası dışındaki en kötü fiyat/performans bölgesi: 2.809 dosyada durmak 12,77 ms ve 1.514 ms açılış verirken, 4.721 dosya 10,96 ms için 2.691 ms istiyor.
- Yöntem: opcache ölçümüyle aynı imajlar, aynı PHP 8.4 derlemesi, aynı ölçüm noktası — konteynerin sunduğu ilk istek. Küratörlük elle seçilmiş bir sınıf listesi değil, Composer classmap'i üzerinde bir **yol filtresi**: elle seçilmiş liste tekrar edilemez, filtre edilebilir. Beş varyant kasıtlı olarak iç içe (framework ⊂ +symfony ⊂ +psr/carbon ⊂ hepsi), böylece eğri "şunu da ekleyince" diye okunuyor, dört bağımsız nokta olarak değil. Her varyant için taze konteyner, üç tekrar, medyan. Preload php-fpm'in master sürecinde koştuğu için bedeli konteynerin ilk 200 yanıtı verene kadar geçen sürede ölçülüyor; bu pencere nginx'in açılışını da içeriyor ama beş varyantta da aynı sabit.
- Metrikler: Tatlı nokta: 2.809 dosya: 12,77 ms (−%81) · Aynı noktanın açılış bedeli: +1.132 ms · 123 dosyalık dilimin kazancı: 15,7 ms · Son 1.912 dosyanın kazancı: 1,8 ms
- Ölçüm tarihi: 2026-08-22
- Güven: Yüksek güven
- Durum: Yürürlükte
- Program: Dil & çalışma zamanı
- Ortam: PHP 8.4.24 NTS · opcache açık · JIT kapalı · Uygulama Laravel, production kurulumu, classmap-authoritative · Varyant classmap üzerinde yol filtresi · beş dilim, iç içe · Tekrar 3 · medyan raporlanır · Donanım Apple M4 Pro · 12 çekirdek · Docker Desktop 29.7.2 · aarch64
- Teknolojiler: PHP, opcache, Laravel, Composer, Docker, nginx
- Tekrarlamak için: REPEATS=3 ./bench/preload-curate.sh
- Kaynak kodu: https://github.com/muhammetsafak/php-framework-bench
- Ham veri: https://github.com/muhammetsafak/php-framework-bench/blob/main/results/2026-08-22/preload-curate.json
- Ham veri lisansı: https://github.com/muhammetsafak/php-framework-bench/blob/main/LICENSE
- Yayın: 2026-08-23
- Kaynak: https://www.muhammetsafak.com.tr/research/laravel-preload-egrisi/
- Dil: tr-TR
- Yazar: Muhammet Şafak

---
[opcache ölçümü](/research/opcache-preload-deploy-faturasi/) Laravel'i iki nokta
arasında bıraktı: resmî preload dosyası yok, soğuk ilk istek 76 ms, ve classmap'ten
körlemesine üretilen preload 14 ms'ye indiriyor ama php-fpm'in açılışına 2,3 saniye
ekliyor. O kayıt bunu "tavan" diye ölçtü. Bu kayıt aradaki eğriyi çıkarıyor — ve
tavanın aslında kötü bir seçim olduğunu gösteriyor.

## Eğri

**Soğuk ilk istek, preload edilen dosya sayısına göre**

Beş varyant iç içe: her nokta bir öncekine dilim ekliyor. Yatay eksen derlenen dosya sayısı.

Kaynak: bench/preload-curate.sh, üç tekrarın medyanı

|  | 0 | 1.592 | 2.686 | 2.809 | 4.721 |
| --- | --- | --- | --- | --- | --- |
| soğuk ilk istek | 68.37 ms | 38.01 ms | 28.48 ms | 12.77 ms | 10.96 ms |

| Dilim | Derlenen | Soğuk istek | fpm hazır | Marjinal kazanç | Marjinal bedel |
| --- | --- | --- | --- | --- | --- |
| preload yok | 0 | 68,37 ms | 382 ms | — | — |
| laravel/framework | 1.592 | 38,01 ms | 1.553 ms | −30,4 ms | +1.171 ms |
| + symfony | 2.686 | 28,48 ms | 1.538 ms | −9,5 ms | bedava |
| + psr, carbon | 2.809 | 12,77 ms | 1.514 ms | −15,7 ms | bedava |
| hepsi | 4.721 | 10,96 ms | 2.691 ms | −1,8 ms | +1.177 ms |

Marjinal sütunlar bir önceki satıra göre. “Bedava” = açılış farkı ölçüm gürültüsünün içinde.

## Kaç değil, hangisi

Eğrinin şekli hacimle orantılı değil ve bu, kaydın asıl bulgusu.

**123 dosya, 1.912 dosyadan sekiz kat fazla kazandırıyor.** `psr` ve `carbon`
dilimi yalnız 123 dosya ekliyor ve soğuk isteği 28,48'den 12,77 ms'ye düşürüyor.
Ondan sonra gelen 1.912 dosya yalnız 1,8 ms alıyor.

Sebep tarih işlemede: Laravel'in ilk isteği Carbon'un yükleme zincirini
tetikliyor ve o zincir derinden bağlantılı — preload edilmediğinde her istekte
yeniden çözülüyor. Bir framework'ün "ağır" olması, çok dosyası olması değil;
ilk istekte hangi ağacı yürüdüğü.

> **Sonuç**
>
> Preload'ı hacimle ölçmek yanlış soru. Doğru soru "ilk istek hangi ağacı
> yürüyor". Laravel'de o ağacın büyük kısmı 2.809 dosyada bitiyor; kalan 1.912
> dosya isteğin uğramadığı koddur ve preload edilmesi yalnız açılışa yazılıyor.

## "Hepsini derle" en kötü seçim

Önceki kayıt classmap tavanını iyimser bir üst sınır gibi ölçmüştü. Eğri onu
başka türlü gösteriyor: 4.721 dosya, 2.809 dosyaya göre **1,8 ms** kazandırıp
**1.177 ms** açılış ekliyor. Yani son dilimin fiyatı, kazandırdığı milisaniye
başına 654 milisaniye.

Günde on kez deploy eden bir servis için bu, günde on iki saniyelik bir açılış
gecikmesi karşılığında ilk ziyaretçiye 1,8 ms. Sürekli trafiği olan bir serviste
bile takas zayıf.

## Symfony'ye yetişemiyor

Symfony kendi resmî dosyasıyla **2,50 ms**'ye iniyor. Laravel'in en iyi noktası
10,96 ms — dört kat geride, ve hepsini preload etmesine rağmen.

Fark yapısal: Symfony'nin preload dosyası **derlenmiş container**'ından üretiliyor,
yani servis tanımlarının çözümü zaten derleme anında yapılmış durumda. Laravel'in
service container'ı çalışma anında çözüyor ve preload o işi ortadan kaldırmıyor,
yalnız sınıf derlemesini kaldırıyor. Preload PHP kaynağını derlemekten kurtarır,
uygulamanın kendi kurulum işinden kurtarmaz.

> **Sınır**
>
> Filtreler bu uygulamanın bağımlılık ağacına göre seçildi; başka bir Laravel
> uygulamasında `carbon` dilimi bu kadar belirleyici olmayabilir, ve kendi
> paketleriniz eğriye yeni bir dilim ekler. Ölçüm bir liste değil bir **yöntem**
> bırakıyor: kendi uygulamanızda `bench/preload-curate.sh`'ı kendi filtrelerinizle
> koşup kendi eğrinizi çıkarın. Ayrıca "soğuk" burada opcache'in boş olması demek,
> sayfa önbelleğinin soğuk olması değil — tek atışlık bir denemede aynı `preload yok`
> varyantı 137 ms verdi, üç tekrarın medyanı 68,37 ms.

## Laravel'in eksik dosyası

Bu ölçümün bıraktığı şey bir sayı değil, bir dosya: Laravel için `^/vendor/(laravel\/framework|symfony|psr|nesbot|carbon)/` filtresiyle üretilen preload, 12,77 ms ve 1,5 saniyelik açılışla, framework'ün kendisinin yayınlamadığı şeyi veriyor. Üretici script depoda duruyor ve herhangi bir Laravel uygulamasında koşuyor.
