# Bir PHP framework'ünü kurmanın sabit maliyeti: disk boyutu hiçbir şey söylemiyor

> Yedi PHP framework'ünün yüksüz maliyeti: vendor boyutu, istek başına dosya, tepe bellek ve opcache soğukken ödenen ilk istek.

- Tür: Ölçüm
- Soru: Yedi PHP framework'ü kurulduğunda diskte kaç megabayt, istek başına kaç dosya ve ilk istekte kaç milisaniye tutuyor — ve bu sayılardan hangisi gerçekten yük altındaki hızı öngörüyor?
- Bulgu: Disk boyutu hiçbir şey öngörmüyor: Yii2 en büyük vendor'a sahip (34,1 MB) ama istek başına yalnız 62 dosya yüklüyor — sahanın en azlarından. İstek başına dosya sayısı da öngörmüyor: CodeIgniter 96 dosya yükleyip 6.431 istek/sn veriyor, Symfony 224 dosya yükleyip 13.067 veriyor. Gerçekten ayrışan tek şey opcache soğukken ödenen ilk istek: Phalcon 2,2 ms, Laravel 72,2 ms — otuz üç kat. Bu, her deploy'dan sonra ilk ziyaretçinin ödediği derleme faturasıdır ve framework başına birkaç kilobayt değil, onlarca milisaniye tutuyor.
- Yöntem: Yük ölçümüyle aynı imajlar, aynı PHP 8.4.24 derlemesi ve aynı production kurulumu. Her aday için taze bir konteyner ayağa kaldırıldı ve ölçülenler: `composer.lock` paket sayısı, `du -sb vendor`, `find vendor -type f | wc -l`, taze konteynerin karşıladığı **ilk** isteğin süresi (opcache boş — soğuk), ardından 5 saniyelik ısıtmadan sonra aynı isteğin süresi (sıcak), o istekte `get_included_files()` sayısı ve `memory_get_peak_usage(false)`. Boot süresi front controller'ın ilk satırından yanıt üretimine kadar ölçülüyor. `composer install` süresi, paket önbelleği önceden ısıtılmış bir konteynerde `--no-dev --optimize-autoloader --classmap-authoritative` bayraklarıyla üç kez koşulup medyanı alındı; ölçülen şey indirme hızı değil kurulum işi. Sayaçların hepsi deterministik ve tekrar edildiğinde aynı çıkıyor; tek gürültülü değer kurulum süresidir.
- Metrikler: Soğuk ilk istek, en yavaş: 72,2 ms · Soğuk ilk istek, en hızlı: 2,2 ms · En büyük vendor: 34,1 MB · En çok yüklenen dosya: 359
- Ölçüm tarihi: 2026-08-20
- Güven: Yüksek güven
- Durum: Yürürlükte
- Program: Araç karşılaştırması
- Ortam: PHP 8.4.24 NTS · opcache açık · JIT kapalı · opcache validate_timestamps=0 · 256 MB · preload yok · Composer 2.x · --no-dev --optimize-autoloader --classmap-authoritative · Sunucu nginx 1.29.1 + php-fpm · pm=static · 8 worker · Donanım Apple M4 Pro · 12 çekirdek · 24 GB · macOS 26.6.1 · Sanallaştırma Docker Desktop 29.7.2 · 12 vCPU · aarch64
- Teknolojiler: Laravel, Symfony, CodeIgniter, Yii2, Phalcon, Laminas, Slim, PHP, Composer, Docker
- Tekrarlamak için: STAMP=$(date -u +%F) ./bench/static-metrics.sh
- Kaynak kodu: https://github.com/muhammetsafak/php-framework-bench
- Ham veri: https://github.com/muhammetsafak/php-framework-bench/blob/main/results/2026-08-20/static.json
- Ham veri lisansı: https://github.com/muhammetsafak/php-framework-bench/blob/main/LICENSE
- Yayın: 2026-08-20
- Kaynak: https://muhammetsafak.com/tr/research/php-framework-ayak-izi/
- Dil: tr-TR
- Yazar: Muhammet Şafak

---
[Yük ölçümü](/tr/research/php-framework-yuk-testi/) framework'lerin saniyede kaç
isteği karşıladığını söylüyor. Bu kayıt daha sessiz bir soruyu kovalıyor: o
framework'ü kurmanın **sabit** maliyeti ne? Diskte ne kadar yer tutuyor, istek
başına kaç dosya açıyor, ve deploy'dan sonraki ilk ziyaretçi ne ödüyor?

Sorunun pratik tarafı şu: bu sayılardan hangisine bakarak bir framework'ün "ağır"
olduğuna karar verebilirsiniz? Cevap, sandığımdan kısa çıktı.

## Diskteki boyut hiçbir şey öngörmüyor

| Aday | Paket | vendor | Dosya | İstek başına yüklenen | Tepe bellek | composer install |
| --- | --- | --- | --- | --- | --- | --- |
| Phalcon | 0 | 0 MB | 12 | 7 | 502 kB | 0,2 sn |
| Slim | 12 | 0,9 MB | 229 | 79 | 398 kB | 0,5 sn |
| CodeIgniter | 3 | 4,6 MB | 781 | 96 | 535 kB | 0,6 sn |
| Laminas | 23 | 7,7 MB | 1.362 | 269 | 607 kB | 0,6 sn |
| Symfony | 51 | 15,8 MB | 3.362 | 224 | 517 kB | 0,9 sn |
| Laravel | 76 | 29,6 MB | 6.447 | 359 | 703 kB | 1,2 sn |
| Yii2 | 25 | 34,1 MB | 2.927 | 62 | 815 kB | 0,9 sn |

vendor boyutuna göre sıralı. Son iki sütun aynı yönde hareket etmiyor: Yii2 en büyük ağacı diske yazıyor ve istek başına PHP ile yazılmış altı framework içinde en az dosyayı açıyor.

Tablodaki en öğretici satır **Yii2**. 34,1 MB'lık vendor ağacıyla sahanın en
büyüğü — Laravel'den bile büyük — ama bir isteği karşılarken yalnız **62 dosya**
yüklüyor. Laravel 359, Laminas 269, Symfony 224 yüklüyor. Yii2'nin diske yazdığı
şeyin çoğu bir isteğin yolunda hiç durmuyor.

Tersi de doğru: **CodeIgniter** yalnız 3 composer paketiyle geliyor, Composer kullanan altı
framework içinde en sade bağımlılık ağacı. Ama bu sadelik hıza dönüşmüyor.

## İstek başına dosya da öngörmüyor

**Bir isteği karşılarken yüklenen dosya sayısı**

Sezgi 'az dosya = hızlı' der. CodeIgniter 96 dosyayla 6.431 istek/sn veriyor, Symfony 224 dosyayla 13.067 — iki katı dosya, iki katı istek.

Kaynak: get_included_files(), ısınmış konteynerde, tek istek

|  | Phalcon | Yii2 | Slim | CodeIgniter | Symfony | Laminas | Laravel |
| --- | --- | --- | --- | --- | --- | --- | --- |
| yüklenen dosya | 7 | 62 | 79 | 96 | 224 | 269 | 359 |

Yük ölçümündeki sayıları bu tablonun yanına koyunca ilişki dağılıyor.
CodeIgniter istek başına 96 dosya yükleyip **6.431 istek/sn** veriyor; Symfony
224 dosya yükleyip **13.067** veriyor. İki katından fazla dosya açan framework,
iki katından fazla isteği karşılıyor.

Sebebi opcache. `validate_timestamps=0` ile bir dosya bir kez derlenir ve
paylaşımlı bellekte kalır; sonraki isteklerde "yüklemek", diskten okumak değil,
hazır opcode'a bağlanmak demektir. Dosya sayısı o yüzden **sıcak** yolda ucuz.
Nerede pahalı olduğunu görmek için opcache'i boşaltmak gerekiyor.

## Asıl fark: soğuk ilk istek

**Taze konteynerin karşıladığı ilk isteğin süresi (opcache boş)**

Her deploy'dan sonra ilk ziyaretçinin ödediği derleme faturası. Phalcon'un ödemediği şey bu: framework zaten PHP'ye eklenti olarak yüklü.

Kaynak: Taze konteyner, ilk HTTP isteği, front controller'dan yanıta

|  | Phalcon | Slim | Yii2 | CodeIgniter | Laminas | Symfony | Laravel |
| --- | --- | --- | --- | --- | --- | --- | --- |
| soğuk ilk istek | 2.2 ms | 7.9 ms | 17.4 ms | 22.2 ms | 27.7 ms | 35.7 ms | 72.2 ms |

Soğuk ile sıcak arasındaki oran, framework'ün derleme faturasını doğrudan
veriyor:

| Aday | Soğuk ilk istek | Sıcak istek | Oran |
| --- | --- | --- | --- |
| Phalcon | 2,2 ms | 0,41 ms | 5× |
| Slim | 7,9 ms | 0,35 ms | 23× |
| Yii2 | 17,4 ms | 0,45 ms | 39× |
| CodeIgniter | 22,2 ms | 1,04 ms | 21× |
| Laminas | 27,7 ms | 0,79 ms | 35× |
| Symfony | 35,7 ms | 0,69 ms | 52× |
| Laravel | 72,2 ms | 1,26 ms | 57× |

Aynı istek, aynı konteyner. Tek fark opcache'in dolu olup olmaması.

> **Sonuç**
>
> Bir framework'ün "ağırlığını" ölçmek istiyorsanız bakılacak sayı vendor
> klasörünün boyutu değil, opcache soğukken ödenen ilk istek. Laravel'de bu 72
> milisaniye, Phalcon'da 2. Aradaki 70 ms, her deploy'dan sonra ve opcache her
> sıfırlandığında yeniden ödenir.

Opcache paylaşımlı bellekte yaşar; havuz her dosyayı deploy başına bir kez
derler, worker başına değil. Trafiği yoğun bir sitede bu kısa bir sıçrama olarak
görünür ve kaybolur; günde birkaç ziyaretçi
alan bir sayfada ilk ziyaretçi bunu her seferinde öder.

## Tepe bellek: en az beklenen sıra

Tablodaki en ters sonuç bellekte. İstek başına en çok dosya yükleyen Laravel
(359 dosya) 703 kB tepe bellek kullanıyor; PHP kaynaklı altı framework içinde en az dosya yükleyen Yii2 (62 dosya)
**815 kB** ile sahanın en yükseği. Dosya sayısı burada da yanıltıyor: bellek,
kaç dosyanın açıldığına değil, o dosyaların kaç nesne kurduğuna bağlı.

Slim 398 kB ile en düşüğü — beklendiği gibi, çünkü kurduğu nesne az. Phalcon'un
502 kB'ı ise ilginç: PHP tarafında neredeyse hiç kod çalıştırmıyor ama nesneleri
yine de PHP'nin bellek alanında kuruyor.

## Atlanmayan bulgular

1. **Phalcon'un `composer install`'ı 0,2 saniye çünkü kuracak bir şey yok.**
   Depoda 12 dosya var ve `composer.lock` boş bir paket listesi taşıyor.
   Framework, PHP'ye yüklenen derlenmiş bir C eklentisi. Karşılığında bu adayın
   bir dezavantajı var: sürümü yükseltmek `composer update` değil, sunucuda
   eklenti derlemek demek.
2. **`ext-psr` yüzünden ortak imaj çatallandı.** Phalcon `ext-psr` istiyor ve o
   eklenti yüklüyken Symfony PHP 8.4'te fatal veriyor. Phalcon kendi runtime
   imajında koşuyor; PHP sürümü, opcache ayarı, nginx ve php-fpm havuzu birebir
   aynı, fark yalnız o iki eklenti.
3. **`ext-mysqli` yedisine birden kuruldu** çünkü CodeIgniter 4'ün PDO sürücüsü
   yok. Diğer altısı kullanmıyor; eklenti seti aynı kalsın diye orada duruyor.
4. **Laminas'ın resmî iskeleti PHP 8.4 için yayınlanmamış.**
   `laminas-mvc-skeleton` 2.4.0 `~8.1.0 || ~8.2.0 || ~8.3.0` diyor ve kurulum
   `--ignore-platform-req=php` olmadan reddediliyor. Bu, tablodaki 23 paket ve
   1.362 dosyanın resmî olarak desteklenmeyen bir sürümde kurulduğu anlamına
   gelir.
5. **Yii2'nin 34,1 MB'ı büyük ölçüde bower/npm varlıklarıdır.** Temel iskelet
   jQuery ve Bootstrap paketlerini vendor ağacına indiriyor; hiçbiri bu ölçümün
   rotalarında kullanılmıyor.
6. **`composer install` süreleri paket önbelleği sıcakken ölçüldü.** Soğuk
   önbellekte rakamlar ağ hızına bağlı olur ve framework hakkında bir şey
   söylemez. Üç koşunun medyanı alındı; tablodaki tek gürültülü sütun budur.
7. **opcache preload hiçbir adayda açılmadı.** CodeIgniter kutuda bir
   `preload.php` ile geliyor, Laravel ve Symfony için de yaygın tarifler var.
   Açık preload soğuk ilk istek rakamlarını kökten değiştirir — ama yedisinin
   ortak zemini değil, o yüzden kapsam dışı bırakıldı. Ayrı bir ölçüm konusu.
8. **İmaj boyutları framework'ü ayırt etmiyor.** 486-518 MB arasındalar ve farkın
   neredeyse tamamı ortak PHP taban imajından geliyor; vendor ağacı yanında
   küçük kalıyor. Bu yüzden tabloya alınmadı, ham veride duruyor.
