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

> Aynı yedi aday, aynı ölçüm ortamı. Bu kez yük yok: paket sayısı, vendor boyutu, istek başına yüklenen dosya, tepe bellek ve opcache soğukken ödenen ilk istek bedeli.

- 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.
- Ölçüm tarihi: 2026-08-20
- Güven: Yüksek güven
- 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
- Ham veri: https://github.com/muhammetsafak/php-framework-bench/blob/main/results/2026-08-20/static.json
- Yayın: 2026-08-20
- Kaynak: https://www.muhammetsafak.com.tr/research/php-framework-ayak-izi/
- Dil: tr-TR
- Yazar: Muhammet Şafak

---
[Yük ölçümü](/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 sahanın en az dosyasını 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, sahanın 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 ikilisinin içinde.

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 — üstelik yalnız bir kez değil, php-fpm'in her
> worker'ı için ayrı ayrı.

Sekiz worker'lı bir havuzda bu, deploy sonrası ilk sekiz isteğin Laravel'de
yarım saniyeye yakın toplam gecikme demek. Trafiği yoğun bir sitede bu birkaç
yüz milisaniyelik 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; 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 ikilisine 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.
