Wordpress İle Özel Bir Dinamik Görsel Sıkıştırma Servisi Nasıl Yapılır?

Wordpress İle Özel Bir Dinamik Görsel Sıkıştırma Servisi Nasıl Yapılır?
Wordpress İle Özel Bir Dinamik Görsel Sıkıştırma Servisi Nasıl Yapılır?

Gereksinimler ve Ön Hazırlık

Bu projeye başlamadan önce sunucunuzda aşağıdaki bileşenlerin yüklü ve aktif olduğundan emin olmalısınız. Aksi takdirde görsel işleme fonksiyonları çalışmayacaktır.

  • PHP 8.2 veya üzeri: Güncel performans ve güvenlik iyileştirmeleri için gereklidir.
  • GD Library veya Imagick: PHP'nin görsel işleme kütüphaneleridir. phpinfo() çıktınızda bu modüllerin "enabled" olduğunu doğrulayın.
  • WP-Cron Yetkisi: İşlemleri arka plana atmak için WordPress'in zamanlanmış görevler sistemine ihtiyacımız var.
  • Yazma İzni: wp-content/uploads dizinine PHP'nin dosya yazma ve değiştirme yetkisi olmalıdır.
Güvenlik Uyarısı: Görsel işleme süreçlerinde "ImageTragick" gibi bilinen zafiyetlere karşı sunucunuzdaki Imagick sürümünün güncel olduğundan emin olun. Ayrıca, yüklenen dosyaların MIME türlerini mutlaka doğrulayın.

Adım 1: Görsel Yükleme Kancasını (Hook) Tanımlama

WordPress'e bir görsel yüklendiğinde tetiklenen wp_generate_attachment_metadata filtresini kullanacağız. Bu filtre, görsel oluşturulduktan hemen sonra çalışır ve meta verileri döndürür. Biz bu aşamada görselin orijinal halini alıp sıkıştırma fonksiyonumuza göndereceğiz.


add_filter('wp_generate_attachment_metadata', 'ozel_gorsel_sikistirma_tetikleyici', 10, 2);

function ozel_gorsel_sikistirma_tetikleyici($metadata, $attachment_id) {
    $file_path = get_attached_file($attachment_id);
    $mime_type = get_post_mime_type($attachment_id);

    // Sadece JPEG ve PNG dosyalarını işle
    if (in_array($mime_type, ['image/jpeg', 'image/png'])) {
        // İşlemi arka plana atarak sayfa yüklenmesini engellemiyoruz
        wp_schedule_single_event(time(), 'ozel_sikistirma_baslat', array($file_path));
    }

    return $metadata;
}

Bu kod bloğu, görsel yüklendiğinde bir cron görevi oluşturur. wp_schedule_single_event kullanımı, kullanıcının görsel yükleme ekranında beklemesini engeller; işlem arka planda gerçekleşir.

Adım 2: Dinamik Sıkıştırma Motorunu Oluşturma

Sıkıştırma işlemini gerçekleştirecek olan ana fonksiyonumuzu yazalım. Burada imagejpeg fonksiyonunun kalite parametresini kullanarak dosya boyutunu düşüreceğiz. Kalite oranını %80-85 arasında tutmak, görsel kalitesinde gözle görülür bir kayıp olmadan ciddi boyut tasarrufu sağlar.


function ozel_gorsel_sikistirma_motoru($file_path) {
    $info = getimagesize($file_path);
    $mime = $info['mime'];

    switch ($mime) {
        case 'image/jpeg':
            $image = imagecreatefromjpeg($file_path);
            imagejpeg($image, $file_path, 80); // %80 kalite
            break;
        case 'image/png':
            $image = imagecreatefrompng($file_path);
            imagepng($image, $file_path, 8); // PNG için 0-9 arası sıkıştırma
            break;
    }
    imagedestroy($image);
}
add_action('ozel_sikistirma_baslat', 'ozel_gorsel_sikistirma_motoru');

Bu fonksiyon, dosyanın türünü tespit eder ve uygun PHP kütüphanesini kullanarak dosyayı üzerine yazar. imagedestroy kullanımı, bellek sızıntılarını (memory leaks) önlemek için kritiktir.

Adım 3: Performans ve Yöntem Karşılaştırması

Kendi sıkıştırma servisinizi kurarken farklı yöntemlerin avantaj ve dezavantajlarını bilmek önemlidir. Aşağıdaki tablo, WordPress ekosistemindeki yaygın yaklaşımları özetler.

Yöntem Avantaj Dezavantaj
PHP GD (Yerel) Hızlı, ücretsiz, dış bağımlılık yok Gelişmiş filtreleme seçenekleri az
Imagick (Yerel) Çok güçlü, yüksek kalite Sunucu CPU tüketimi yüksek
Dış API (TinyPNG vb.) Çok yüksek sıkıştırma oranı Maliyetli, API limitlerine tabi

Adım 4: Hata Ayıklama ve Loglama Mekanizması

Arka planda çalışan işlemlerin hata verip vermediğini anlamak için bir loglama sistemi kurmalısınız. Eğer sıkıştırma başarısız olursa, orijinal görselin bozulmadığından emin olmamız gerekir.


function log_sikistirma_hatasi($message) {
    $log_file = WP_CONTENT_DIR . '/uploads/sikistirma_log.txt';
    $timestamp = date('Y-m-d H:i:s');
    file_put_contents($log_file, "[$timestamp] $message" . PHP_EOL, FILE_APPEND);
}

// Motor içerisine ekleme:
if (!$image) {
    log_sikistirma_hatasi("Görsel işlenemedi: " . $file_path);
    return;
}

Bu yapı, işlemin neden başarısız olduğunu takip etmenizi sağlar. Özellikle büyük boyutlu görsellerde PHP'nin memory_limit değerine takılıp takılmadığınızı bu loglardan görebilirsiniz.

Adım 5: Güvenlik ve Dosya Doğrulama

Kullanıcıların yüklediği dosyalar her zaman güvenli olmayabilir. Bir saldırgan, görsel gibi görünen bir PHP dosyası yükleyebilir. Bu yüzden dosya içeriğini doğrulamak ve sadece izin verilen MIME türlerini işlemek zorunludur.


function guvenli_dosya_kontrolu($file_path) {
    $finfo = finfo_open(FILEINFO_MIME_TYPE);
    $mime = finfo_file($finfo, $file_path);
    finfo_close($finfo);

    $izinli_turler = ['image/jpeg', 'image/png'];
    if (!in_array($mime, $izinli_turler)) {
        throw new Exception("İzin verilmeyen dosya türü.");
    }
}

Bu fonksiyon, dosyanın uzantısına değil, gerçek MIME türüne bakar. finfo kullanımı, dosya içeriğinin doğrulanması için en güvenli yöntemdir.

Adım 6: Sıkça Sorulan Sorular

Sunucumun CPU kullanımı neden artıyor?

Görsel işleme yoğun bir işlemdir. Eğer aynı anda çok sayıda görsel yükleniyorsa, sunucunuzun işlemci kapasitesini zorlayabilir. Bu durumda işlemleri gece saatlerine erteleyen bir kuyruk sistemi kullanabilirsiniz.

Görsellerde kalite kaybı çok fazla, ne yapmalıyım?

imagejpeg fonksiyonundaki kalite değerini 80'den 90'a çıkarın. Ayrıca, PNG dosyaları için imagepng sıkıştırma seviyesini 6'ya düşürerek kaliteyi artırabilirsiniz.

Bu yöntem WebP formatını destekler mi?

Evet, PHP 8.x sürümlerinde imagewebp fonksiyonunu kullanarak görselleri otomatik olarak WebP formatına dönüştürebilirsiniz. Bu, modern tarayıcılar için en iyi performansı sağlar.

Eski görselleri de sıkıştırabilir miyim?

Evet, bir WP-CLI komutu yazarak kütüphanenizdeki mevcut tüm görselleri bu fonksiyon üzerinden geçirebilirsiniz.

Dış servislerden daha mı iyi?

Dış servisler genellikle "lossy" (kayıplı) sıkıştırmada daha agresif algoritmalar kullanır. Ancak kendi çözümünüz, gizlilik ve maliyet avantajı sağlar.

Sorumluluk Reddi: Bu rehberdeki kodlar, sunucu yapılandırmanıza bağlı olarak değişiklik gösterebilir. Uygulamadan önce mutlaka sitenizin tam yedeğini alın. Kodların yanlış kullanımı, görsellerinizin kalıcı olarak bozulmasına yol açabilir.

İleri Düzey Optimizasyon: Görsel Boyutlandırma ve Responsive Servis

Sadece sıkıştırma yapmak, modern web standartlarında yeterli olmayabilir. Kullanıcılarınızın cihazlarına göre doğru boyutlarda görsel sunmak, hem bant genişliğinden tasarruf sağlar hem de LCP (Largest Contentful Paint) değerlerinizi iyileştirir. WordPress'in yerel add_image_size fonksiyonunu, özel sıkıştırma motorumuzla entegre ederek "Responsive Görsel Servisi" oluşturabiliriz.

Aşağıdaki kod bloğu, bir görsel yüklendiğinde hem sıkıştırma işlemini tetikler hem de sistemin ihtiyaç duyduğu özel boyutları (thumbnail, medium, large ve custom) otomatik olarak işler:


function custom_dynamic_image_resizer($file) {
    $image_path = $file['file'];
    $image_info = getimagesize($image_path);
    
    // Sadece JPEG ve PNG dosyaları için işlem yap
    if (in_array($image_info['mime'], ['image/jpeg', 'image/png'])) {
        // Özel sıkıştırma motorunu çağır
        $optimizer = new Custom_Image_Optimizer();
        $optimizer->compress($image_path, 80); // %80 kalite
        
        // WordPress yerel boyutlarını oluştur
        $editor = wp_get_image_editor($image_path);
        if (!is_wp_error($editor)) {
            $editor->resize(1200, 800, false);
            $editor->save($image_path . '-large.jpg');
        }
    }
    return $file;
}
add_filter('wp_handle_upload', 'custom_dynamic_image_resizer');

Dağıtım ve Performans İzleme (Monitoring)

Sisteminizi canlıya aldıktan sonra, sunucu üzerindeki yükü ve sıkıştırma başarı oranlarını takip etmek kritik öneme sahiptir. Özellikle paylaşımlı hosting kullanıyorsanız, PHP işlem süresi (execution time) sınırlarına takılmamak için işlemleri Action Scheduler veya WP-Cron üzerinden kuyruğa almanız önerilir.

Sistemin performansını ölçmek için aşağıdaki basit loglama tablosunu kullanarak hangi görsellerin ne kadar sürede işlendiğini takip edebilirsiniz:

İşlem ID Dosya Boyutu (KB) Sıkıştırma Oranı İşlem Süresi (ms)
#1024 2400 %65 450
#1025 1200 %58 320

Performans İpuçları ve En İyi Uygulamalar

  • Bellek Yönetimi: Çok büyük boyutlu görselleri işlerken PHP memory_limit değerinizin en az 256MB olduğundan emin olun.
  • Eşzamanlılık: Eğer yüksek trafikli bir siteniz varsa, sıkıştırma işlemini ana iş parçacığından ayırarak bir arka plan kuyruğuna (Background Queue) taşıyın.
  • Önbellekleme: Sıkıştırılmış görselleri bir CDN (Content Delivery Network) üzerinden servis ederek sunucu yükünü minimize edin.
  • Format Dönüşümü: Mümkünse imagick kütüphanesini kullanarak görselleri sunucu tarafında AVIF veya WebP formatına dönüştürün.
Dikkat: Kodunuzda ini_set('memory_limit', '512M'); gibi komutlar kullanırken, sunucunuzun bu değişikliğe izin verip vermediğini kontrol edin. Aksi takdirde 500 Internal Server Error hataları ile karşılaşabilirsiniz.

Sonuç

WordPress ile özel bir dinamik görsel sıkıştırma servisi oluşturmak, sitenizin hızını artırmanın en sürdürülebilir yollarından biridir. Bu rehberde, görsel yükleme kancalarını, arka plan işlemlerini ve güvenlik doğrulamalarını adım adım ele aldık. Bir sonraki adım olarak, bu sisteme imagewebp desteğini ekleyerek görsellerinizi otomatik olarak WebP formatına dönüştüren bir "modern görsel servisi" haline getirebilirsiniz. Performans optimizasyonu sürekli bir süreçtir; sunucunuzun kaynaklarını izlemeye ve kullanıcı geri bildirimlerine göre kalite ayarlarınızı optimize etmeye devam edin.

Bu yazıya tepkinizi paylaşın:
Zeynep Kaya

Ev ekonomisi ve kişisel organizasyon üzerine birçok yayın yönettim. Okuyucuların günlük yaşam kalitesini artıracak uygulanabilir çözümler üretmeyi hedefliyorum.

Yorumlar (0)

Yorum Yaz