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
- 01 Packagist API packagist.org · erişim Popülerlik listesi ve p2 metadata ucunun sözleşmesi.
- 02 PHP: Supported Versions php.net · erişim Gecikmenin sıfır noktası olan GA tarihleri.
- 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.
- Doğrulama tarihi
- Yayın
dün doğrulandı
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
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 |
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 |
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 |
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 |
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 |
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
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ı.
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 8.6 yolda: dilin istikrarlı evrimi
PHP 8.6 sürümü çıkmadan önce: yıllık sürüm temposunun öngörülebilirliği ve olgun bir dilde 'sıkıcı' sürümlerin neden iyi haber olduğu.