İçeriğe geç
Muhammet Şafak
en
Araç karşılaştırması

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.

Yüksek güven Tekrarlı ölçüm, denetimli ortam, ham veri paylaşıldı.
Ölçüm tarihi

2 gün önce ölçüldü

Yayın

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

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
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.

düşük olan iyi Kaynak: get_included_files(), ısınmış konteynerde, tek istek

Veri tablosu
get_included_files(), ısınmış konteynerde, tek istek
Seri PhalconYii2SlimCodeIgniterSymfonyLaminasLaravel
yüklenen dosya 7627996224269359

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
Taze konteyner, ilk HTTP isteği, front controller'dan yanıta
Seri PhalconSlimYii2CodeIgniterLaminasSymfonyLaravel
soğuk ilk istek 2,2 ms7,9 ms17,4 ms22,2 ms27,7 ms35,7 ms72,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
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ı.

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.

İlgili yazılar

Paylaş:

Diğer Kayıtlar

Tüm kayıtlar
Servis & yük Ölçüm

Yedi PHP framework'ü aynı yükte ölçtüm: fark, istek gerçek iş yaptıkça küçülüyor

Aynı donanımda, aynı PHP sürümünde ve aynı yedi rotayla, Laravel, Symfony, CodeIgniter, Yii2, Phalcon, Laminas ve Slim saniyede kaç isteği ne gecikmeyle karşılıyor?

Bulgu

Boş bir rotada en hızlı ile en yavaş arasında 4,4 kat var (Slim 25.975, Laravel 5.966 istek/sn). Ama istek gerçek iş yapmaya başlayınca fark kapanıyor: veritabanından tek satır çeken bir istekte 3,7 kata, yirmi satır çekende 3,5 kata iniyor. Phalcon boş rotada üçüncüyken veritabanı isteğinde beşinciye düşüyor — C eklentisi olmak, sorgu beklerken bir işe yaramıyor. Asıl pahalı olan şey framework seçimi değil: Laravel'in kendi varsayılan web middleware grubu, aynı yanıtı 5.858'den 2.176 istek/sn'ye düşürüyor — yani tek bir varsayılan, framework'ler arasındaki farkın çoğundan daha pahalı.

Orta güven
Arayüz performansı Ölçüm

Chart.js'i nasıl import ettiğin, ziyaretçiye kaç kilobayt gönderdiğini belirliyor

`chart.js/auto` ile seçmeli `Chart.register()` arasındaki fark, gerçek bir üretim derlemesinde kaç kilobayt?

Bulgu

Seçmeli register, `chart.js/auto` yerine 9,7 kB gzip tasarruf ettiriyor (67,8 → 58,1 kB, %14,3). Asıl büyük düşüş kütüphanenin kendisinde değil, hiç kullanılmayan controller'ları dışarıda bırakmakta: yalnız çubuk grafiği kaydeden bir sayfa 46,0 kB'a iniyor — auto'nun üçte ikisi.

Yüksek güven

Sitede Ara

Yazı, proje ve sayfalarda arama yapmak için yazmaya başlayın.

Esc ile kapat Pagefind ile güçlendirildi