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/uploadsdizinine 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_limitdeğ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
imagickkütüphanesini kullanarak görselleri sunucu tarafındaAVIFveyaWebPformatı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.


Yorumlar (0)
Yorum Yaz