Bir PHP framework'ünü kurmanın sabit maliyeti: disk boyutu hiçbir şey söylemiyor
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.
- 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
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
- Yayın
2 gün önce ölçüldü
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
Tekrarlamak için
STAMP=$(date -u +%F) ./bench/static-metrics.sh Yük ölçümü 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 C eklentisi — kurulacak bir şey yok | 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 en büyük vendor, en az yüklenen dosya | 25 | 34,1 MB | 2.927 | 62 | 815 kB | 0,9 sn |
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.
düşük olan iyi Kaynak: get_included_files(), ısınmış konteynerde, tek istek
Veri tablosu
| Seri | Phalcon | Yii2 | Slim | CodeIgniter | Symfony | Laminas | Laravel |
|---|---|---|---|---|---|---|---|
| yüklenen dosya | 7 | 62 | 79 | 96 | 224 | 269 | 359 |
Grafik tarayıcıda çizilir; aşağıdaki tablo aynı veriyi taşır.
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.
ms düşük olan iyi Kaynak: Taze konteyner, ilk HTTP isteği, front controller'dan yanıta
Veri tablosu
| Seri | 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 |
Grafik tarayıcıda çizilir; aşağıdaki tablo aynı veriyi taşır.
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× |
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
- Phalcon’un
composer install’ı 0,2 saniye çünkü kuracak bir şey yok. Depoda 12 dosya var vecomposer.lockboş 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ükseltmekcomposer updatedeğil, sunucuda eklenti derlemek demek. ext-psryüzünden ortak imaj çatallandı. Phalconext-psristiyor 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.ext-mysqliyedisine 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.- Laminas’ın resmî iskeleti PHP 8.4 için yayınlanmamış.
laminas-mvc-skeleton2.4.0~8.1.0 || ~8.2.0 || ~8.3.0diyor ve kurulum--ignore-platform-req=phpolmadan reddediliyor. Bu, tablodaki 23 paket ve 1.362 dosyanın resmî olarak desteklenmeyen bir sürümde kurulduğu anlamına gelir. - 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.
composer installsü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.- opcache preload hiçbir adayda açılmadı. CodeIgniter kutuda bir
preload.phpile 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. - İ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.
İlgili yazılar
2026'da PHP ile uygulama geliştirmek: ekosistemin hali
PHP'nin 2026'daki gerçek durumu: dil olgunluğu, ekosistem sağlığı ve 'öldü' söyleminin neden hâlâ yanlış olduğu.
PHP Öldü mü? 2026 Tablosu, Veriyle
18 yıllık bir PHP geliştiricisinin gözünden — W3Techs, Stack Overflow, JetBrains ve Packagist verileriyle PHP'nin 2026 fotoğrafı, ve dilin görmezden gelinen zayıflıkları.