Yükleme uç noktasına bir dosya ulaştığında JekCMS önce boyutlarını yapılandırılmış maksimuma göre kontrol ediyor (varsayılan: en uzun kenarda 1920 piksel). Limiti aşan dosyalar herhangi bir format dönüşümü başlamadan önce küçültülüyor. Bu ön ölçekleme adımı, AVIF kodlayıcının öngörülebilir boyuttaki bir girdi üzerinde çalışmasını sağlıyor ve beklenmedik büyüklükte çıktı dosyalarını önlüyor.

EXIF Sıyırma ve Güvenli Depolama

EXIF sıyırma işlemi sunucuda hangisi mevcutsa GD veya Imagick uzantısını kullanıyor. Dönüştürülmüş dosya diske yazılmadan önce tüm meta veriler kaldırılıyor: GPS koordinatları, kamera modeli, oluşturma zaman damgaları ve gömülü küçük resimler. Orijinal dosya karma adıyla uploads/originals/ altında depolanıyor ve hiçbir zaman HTTP üzerinden sunulmuyor. Dizinde .htaccess yeniden yazma kuralı yok ancak web sunucusu yapılandırması doğrudan erişimi varsayılan olarak engelliyor.

Dört Küçük Resim Boyutu ve Kalite Ayarları

Yükleme sırasında eş zamanlı olarak dört küçük resim boyutu oluşturuluyor: thumbnail (400×400 merkez kırpma), medium (800 piksel genişlik, orantılı yükseklik), large (1600 piksel genişlik, orantılı yükseklik) ve pinterest (1000×1500 yüz algılıklı kırpma). AVIF kalite ayarı 80, WebP'ninki 85. Her ikisi de config/media.php dosyasında yükleme bağlamı başına ayrı ayrı yapılandırılabiliyor.

Özel Temalarda Görselleri Sunmak

Yerleşik temalarda görseller AVIF'in birincil kaynak, WebP'nin yedek olduğu <picture> öğesiyle sunuluyor. Özel bir tema geliştiriyorsanız get_featured_image($post, 'medium') yardımcısını kullanın; bu fonksiyon tarayıcı yetenek müzakeresi temelinde doğru kaynak URL'yi döndürüyor ve küçük resim boyutunun oluşturulmadığı durumu da yönetiyor. Doğru width ve height niteliklerini de eklemek, tarayıcının görsel yüklenmeden önce alan rezerve etmesini sağlayarak düzen kaymasını önlüyor.

İşlem Hattının Tamamı: Adım Adım

Tüm görsel işleme hattı bir yükleme isteği sırasında eş zamanlı olarak (veya medya kuyruğu üzerinden tetiklendiğinde eş zamansız olarak) çalışıyor. Dosyanın sunucuya ulaştığı andan sunuma hazır olduğu noktaya kadar gerçekleşen işlem sırası:

1. Yükleme alındı → MIME türü doğrulama (jpeg, png, gif, webp, avif)
2. Dosya boyutu kontrolü → 20 MB üstü reddedilir (yapılandırılabilir)
3. Boyut okuma → en uzun kenar > 1920px ise küçült
4. EXIF meta verileri sıyırma → GPS, kamera bilgisi, zaman damgaları
5. AVIF oluşturma (kalite 80) → birincil sunum formatı
6. WebP oluşturma (kalite 85) → yedek format
7. 4 küçük resim oluşturma (her biri AVIF + WebP olarak):
 - thumbnail: 400x400 merkez kırpma
 - medium: 800px genişlik, orantılı
 - large: 1600px genişlik, orantılı
 - pinterest: 1000x1500 yüz algılıklı kırpma
8. Orijinali sakla → uploads/originals/{hash}.{uzanti}
9. Dönüştürülmüşleri sakla → uploads/images/{yıl}/{ay}/
10. Veritabanı kaydı yaz → media tablosuna tüm yollar
11. Geçici dosyayı sil → temizlik tamamlandı

Dosya Boyutu Küçülme Oranları

Production ortamında işlenen 14.000 görsel üzerinden ölçülen ortalama dosya boyutu küçülmeleri:

  • JPEG'den AVIF'e: %62 daha küçük (ortalama 340 KB'dan 129 KB'a)
  • JPEG'den WebP'ye: %41 daha küçük (ortalama 340 KB'dan 201 KB'a)
  • PNG'den AVIF'e: %78 daha küçük (ortalama 1,2 MB'dan 264 KB'a)
  • PNG'den WebP'ye: %58 daha küçük (ortalama 1,2 MB'dan 504 KB'a)

Image Proxy Yedek Mekanizması

Bir küçük resim varyantı diskte mevcut olmadığında — örneğin, pinterest boyutu eklenmeden önce yüklenmiş bir görsel için — get_featured_image() fonksiyonu includes/image-proxy.php adresindeki yerleşik görsel proxy'ye yönleniyor. Proxy istenen boyutu anında oluşturuyor, sonucu 7 gün boyunca önbelleğe alıyor ve uygun önbellek başlıklarıyla sunuyor.

// Görsel proxy URL formatı
/includes/image-proxy.php?path=images/2026/01/foto.avif&w=800&h=500

// Proxy iç işleyişi:
// 1. Yolu doğrula (dizin geçişi saldırılarını engelle)
// 2. SSRF koruması (özel IP aralıklarını engelle)
// 3. Önbellek kontrolü → tazeyse sun
// 4. GD/Imagick ile yeniden boyutlandır → önbelleğe al → sun
// 5. Çöp toplama her istekte %1 olasılıkla çalışır

Admin Panelden Toplu Dönüştürme

Ayarlar > Medya sayfası, mevcut görselleri geriye dönük olarak dönüştürmek için bir toplu dönüştürme aracı sunuyor. Süreç, paylaşımlı hosting'de bellek limitlerini aşmamak için 50'lik gruplar halinde çalışıyor.

Her grup için sistem WebP versiyonu olan ancak AVIF karşılığı bulunmayan görselleri tespit ediyor, AVIF dosyasını oluşturuyor ve veritabanı kaydını güncelliyor. İlerleme, mevcut grup numarasını ve kalan toplam dosya sayısını döndüren bir yoklama uç noktası aracılığıyla gerçek zamanlı görüntüleniyor.

Dönüştürme Hızı Karşılaştırması

  • Görsel başına ortalama dönüştürme süresi (1200x800 JPEG'den AVIF'e): VPS'te 0,8 saniye, paylaşımlı hosting'de 2,1 saniye
  • 50 görselli grup: VPS'te 40 saniye, paylaşımlı hosting'de 105 saniye
  • 5.000 görselin tam geriye dönük dönüştürmesi: VPS'te yaklaşık 67 dakika
  • Dönüştürme sırasında bellek kullanımı: 4000x3000 kaynak görsel için 128 MB zirve yapıyor

Tarayıcı Desteği ve İçerik Müzakeresi

AVIF, Chrome 85+, Firefox 93+ ve Safari 16.4+ tarafından destekleniyor. AVIF desteği olmayan tarayıcılar için <picture> öğesi otomatik yedek mekanizma sağlıyor. JekCMS sunucu taraflı içerik müzakeresi (Accept başlığı incelemesi) kullanmıyor — karar tamamen tarayıcıda <source> öğesinin type niteliği aracılığıyla gerçekleşiyor. Bu, uygulamayı basit tutuyor ve Accept başlığını iletmeyen CDN'lerle tam uyumlu kılıyor.

<picture>
 <source srcset="/uploads/images/foto.avif" type="image/avif">
 <source srcset="/uploads/images/foto.webp" type="image/webp">
 <img src="/uploads/images/foto.jpg" alt="Açıklama"
 width="800" height="500" loading="lazy">
</picture>