İçeriğe geç
Muhammet Şafak
en

PHP ekosistemi yeni sürümü beklemiyor — ama desteklediğini de söylemiyor

Bir PHP sürümü çıktıktan sonra en çok kurulan 500 Composer paketi onu desteklediğini ne zaman beyan ediyor, ve o beyan ne kadar bilgi taşıyor?

Bulgu

Kurulumların %43,5'i üst sınırı hiç yazmayan bir kısıtla geliyor — `symfony/console` bugün `>=8.4.1` diyor, yani PHP 12'yi de desteklediğini iddia ediyor. Üst sınır yazan 280 paketin 247'si taahhüdünü sürüm daha doğmadan vermiş: `guzzlehttp/guzzle` 8.4'ü Ekim 2020'de, dört yıl önceden kapsamış. Geriye gerçekten bekleyen 33 paket kalıyor, medyanları 325 gün. Ham sayılar sürümden sürüme düşüp 'ekosistem hızlanıyor' diye okunuyor; eşit gözlem penceresinde bakınca trend tersine dönüyor (238 → 215 → 325 gün).

Üst sınırsız kısıtla gelen kurulum
%43,5
Önceden taahhüt eden
247 / 280 paket
Gerçekten bekleyenlerin medyanı
325 gün
Eşit pencerede 8.2 → 8.4
238 → 325 gün +%37

3 kaynak

  1. 01 Packagist API packagist.org · erişim Popülerlik listesi ve p2 metadata ucunun sözleşmesi.
  2. 02 PHP: Supported Versions php.net · erişim Gecikmenin sıfır noktası olan GA tarihleri.
  3. 03 Composer — Versions and constraints getcomposer.org · erişim Caret ve tilde okumalarının kaynağı; semver ile farkın kanıtı.

Yöntem

Packagist'in popülerlik uçlarından en çok kurulan 500 paket alındı, her birinin bütün kararlı sürümleri `repo.packagist.org/p2` metadata ucundan çekildi ve her sürümün taşıdığı `require.php` kısıtı okundu. Kısıtlar el yazımı bir okuyucuyla çözülüyor: npm'in `semver`'i Composer'la aynı sözdizimini farklı okuyor (`~8.1` Composer'da `>=8.1 <9.0`, semver'de `>=8.1.0 <8.2.0`), o yüzden ödünç alınmadı; okuyucu çözemediği kısıtı yutmuyor, fırlatıyor ve koşu sayıyor (bu turda 0). Bir kaydın hangi kovaya düştüğü üç elemeden geçiyor: sürümden sonra doğan paketler dışarıda (beklemiş olamazlar), kısıtsız sürümler her PHP'yi kabul ediyor sayılıyor (Composer'ı engellemiyorlar), ve gecikme yalnız üst sınır yazan kısıtlarda ölçülüyor. Sürümler arası karşılaştırma en kısa gözlem penceresine (639 gün) kırpılıyor. Tarama deterministik: aynı gün tekrar koşulduğunda aynı sayıları veriyor.

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

dün doğrulandı

Yayın

Ortam

Evren
Packagist, kuruluma göre ilk 500 paket
Veri ucu
packagist.org/explore/popular.json · repo.packagist.org/p2
Sürüm süzgeci
yalnız kararlı etiketler (dev/alpha/beta/RC hariç)
PHP çıkış tarihleri
php.net/supported-versions (8.2: 2022-12-08 · 8.3: 2023-11-23 · 8.4: 2024-11-21)
Karşılaştırma penceresi
639 gün — en kısa gözlem süresi (8.4)
Okunamayan kısıt
0

Teknolojiler

PHP Composer Packagist

Tekrarlamak için

node scan.mjs --top 500 --php 8.2,8.3,8.4

Sormak istediğim şey basitti: PHP 8.4 çıktıktan sonra ekosistem onu ne zaman desteklemeye başladı? Her ekibin sorduğu soru bu — “ne zaman yükseltebilirim”. Cevabı require.php kısıtlarında aramak makul görünüyordu.

Aradığım sayı çıkmadı. Çıkan şey daha ilginç: o sayının neden aranamayacağı.

İlk cevap: kimse beklememiş

Ham tarama şunu dedi: 500 paketin 481’i PHP 8.4’ü daha çıkmadan önce kabul ediyordu. Kurulum payıyla %99,7. Gerçekten bekleyip sonradan kısıtını genişleten paket sayısı sıfır.

Bu sonuç doğru ama işe yaramaz, çünkü “kabul ediyordu” cümlesinin altında şunlar var:

Paket Kabul eden ilk sürüm Tarih Kısıt
symfony/console 2.0.4 2011-09-26 yok
psr/log 1.0.0 2012-12-21 yok
guzzlehttp/psr7 1.0.0 2015-05-19 >=5.4.0
psr/container 1.0.0 2017-02-14 >=5.3.0
2011'de yazılmış bir alt sınır, 2024'te çıkan bir sürüm hakkında hiçbir şey söylemez. Composer kurar; kodun çalışacağını kimse iddia etmiyor.

2015’te >=5.4.0 yazan bir paket PHP 8.4’ü desteklediğini beyan etmiş olmuyor. Sadece bir alt sınır koymuş oluyor. Composer bu ikisini ayırmaz — kurulumu engellemeyen her şey “uyumlu” sayılır — ama okuyucu ayırmak zorunda.

Kısıtların yarısı üst sınır yazmıyor

En çok kurulan 500 paketin 223’ü üst sınırı hiç kapatmıyor. Kurulum payıyla %56,4. Bu kısıtlar bugün var olmayan PHP sürümlerini de kabul ediyor:

Paket Kurulum Bugünkü kısıt Ne demiş oluyor
symfony/console 1,18 milyar >=8.4.1 PHP 12 dahil her şey
psr/log 1,26 milyar >=8.0.0 PHP 12 dahil her şey
symfony/polyfill-mbstring 1,26 milyar >=7.2 PHP 12 dahil her şey
psr/container 1,10 milyar >=7.4.0 PHP 12 dahil her şey
Symfony 8 PHP 8.4'ün altını kesiyor ama üstünü açık bırakıyor. Bu bir ihmal değil, bilinçli bir politika — ve beyanı geleceğe dönük olarak bilgisiz kılıyor.

Bu bir suçlama değil: üst sınır yazmak bakım maliyeti demektir, her yeni PHP sürümünde bütün bağımlılık ağacını dolaşıp sürüm çıkarmak demektir. Açık uç, bu maliyeti reddetmenin makul bir yolu. Ama sonucu şu: ekosistemin yarısında “destekliyor mu” sorusunun kısıtta bir cevabı yok.

Üst sınır yazanlarda tarih anlam kazanıyor

Geriye 280 paket kalıyor — kısıtı ^8.0 ya da 8.0 - 8.4 gibi üstten kapanan paketler. Burada tarih bir şey söylüyor, çünkü ^8.0 yazmak bilerek verilmiş ileriye dönük bir taahhüttür: “PHP 8’in tamamı.”

PHP Üst sınır yazan Önceden taahhüt Sonradan genişleten Hiç üst sınır yazmayan
8.2 265 201 64 194
8.3 274 223 51 199
8.4 280 247 33 202
Taahhüt edenlerin büyük çoğunluğu taahhüdünü sürüm doğmadan veriyor.

guzzlehttp/guzzle PHP 8.4’ü Ekim 2020’de kapsamış — sürümden dört yıl önce, ^7.2.5 || ^8.0 yazarak. phpunit/phpunit Ağustos 2020’de, doctrine/lexer Mayıs 2020’de. Caret işi yapıyor: bir kez “PHP 8’in tamamı” dediğinizde 8.1, 8.2, 8.3 ve 8.4 için bir daha dosyaya dokunmuyorsunuz.

Bekleyenler ne kadar bekliyor

Gerçekten sonradan genişleten 33 paketin medyanı 325 gün. Bir yıldan fazla.

Paket Kurulum Gecikme Genişlettiği kısıt
guzzlehttp/promises 1,06 milyar 546 gün ^7.2.5 || ^8.0
theseer/tokenizer 822 milyon 362 gün ^7.2 || ^8.0
myclabs/deep-copy 923 milyon 253 gün ^7.1 || ^8.0
nette/utils sahadaki nadir gerçek kapalı aralık 454 milyon 194 gün 8.0 - 8.4
Bu paketlerin çoğu test ve altyapı katmanında duruyor: doğrudan yazdığınız kod değil, bağımlılığınızın bağımlılığı.

Trend diye okunan şey sansür

Ham medyanlar sürümden sürüme düşüyor: 8.2 için 559 gün, 8.3 için 418, 8.4 için 325. “Ekosistem hızlanıyor” cümlesi buradan çıkar ve yanlıştır.

Sebep basit: 8.2’yi üç yıl yedi aydır izliyoruz, 8.4’ü bir yıl dokuz aydır. 8.4 için önümüzdeki bahar kısıtını genişletecek bir paket bugün görünmüyor, yani 8.4’ün medyanı dağılımın yalnız hızlı yarısından geliyor.

Üçünü de en kısa pencereye (639 gün) kırpınca:

PHP Ham medyan İlk 639 günde genişleten O pencerede medyan
8.2 559 gün 35 238 gün
8.3 418 gün 33 215 gün
8.4 325 gün 33 325 gün
Trend kaybolmuyor, yön değiştiriyor: eşit sürede bakınca 8.4 öncekilerden daha yavaş benimsendi.

Pratikte ne işe yarıyor

Bir yükseltmeyi planlarken composer why-not php 8.4 çıktısına bakarsınız ve orada duran paketlerin çoğu bu taramanın “üst sınır yazan” kohortundan gelir. Diğer yarısı hiç görünmez — sizi engellemedikleri için değil, engelleyip engellemeyeceklerini kimsenin bilmediği için. Beyan yokluğu bir yeşil ışık değil, ölçülmemiş bir risk.

Ölçümün kendisi tekrar edilebilir: depoda scan.mjs ve 22 Ağustos 2026 koşusunun ham JSON’u duruyor. PHP 9 çıktığında aynı komut, aynı 500 paket üzerinde çok farklı bir tablo verecek — ve asıl sınav o olacak.

İlgili yazılar

Paylaş:

Diğer Kayıtlar

Tüm kayıtlar

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

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.

dün ölçüldü

Yüksek güven

opcache preload deploy faturasını on dört kata kadar siliyor — ama yedi framework'ün beşi onu size vermiyor

`opcache.preload` açıkken yedi PHP framework'ünün deploy sonrası ilk isteği ne kadar sürüyor, bu kazanç neye mal oluyor, ve kimler ona erişebiliyor?

Bulgu

Preload, soğuk ilk isteği 3,5 ile 14,2 kat arasında kısaltıyor: Symfony 35,58 ms'den 2,50 ms'ye, yani Phalcon'un çıplak seviyesine iniyor. Ama yedi adayın yalnız ikisi (Symfony, CodeIgniter) resmî bir preload dosyası yayınlıyor; kalan beşinde kazanç masada duruyor ve kullanıcının kendi yazmasını bekliyor. Yazmak da göründüğü kadar kolay değil: classmap'ten körlemesine üretilen preload Symfony'yi hiç ayağa kaldırmıyor, CodeIgniter'da ise elle seçilmiş resmî dosyadan (3,13 ms) daha kötü sonuç veriyor (5,29 ms). Ve bedel kaybolmuyor: Laravel'in classmap preload'ı ziyaretçiden aldığı 62 ms'yi php-fpm'in ayağa kalkışına 2.340 ms olarak yazıyor.

dün ölçüldü

Yüksek güven

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.

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

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