Büyük boyutlu görseller web sitenizin yüklenme hızını düşürür. Bu durum hem kullanıcı deneyimini hem de SEO başarılarınızı olumsuz etkiler. TinyPNG, kaliteden ödün vermeden görselleri sıkıştırmak için harika bir çözümdür.
Bu yazıda, sunucunuza yüklenen resimleri daha kaydedilmeden TinyPNG API ve PHP cURL kullanarak nasıl optimize edeceğinizi öğreneceksiniz.
Gerekli Hazırlıklar
Kodlama aşamasına geçmeden önce iki şeye ihtiyacımız var:
- TinyPNG API Anahtarı: TinyPNG Developer sayfasından ücretsiz bir hesap açarak aylık 500 resmi ücretsiz optimize edebileceğiniz API anahtarınızı alınız.
- PHP cURL Kütüphanesi: Sunucunuzda cURL eklentisinin aktif olduğundan emin olunuz.
Adım Adım PHP cURL ile Resim Sıkıştırma
Aşağıda sunucuya geçici olarak yüklenen resim dosyalarını kalıcı kayıttan önce API aracılığı ile optimizasyon için TinyPNG sunucusuna göndererek optimize edilmelerini sağlıyoruz. Gelen cevaptaki resim dosyasını indirerek sunucumuza optimize edilmiş resim dosyasını kalıcı olarak kaydediyoruz. Eğer bir hata ile karşılaşırsak resim dosyasını optimize etmeden, olduğu gibi diske kaydediyoruz.
<?php
// Hedef yükleme klasörünü tanımlıyoruz.
$file = 'uploads';
// Formun gönderildiğini ve işlemin 'upload' olduğunu doğruluyoruz.
if (isset($_POST['do']) && $_POST['do'] === 'upload' && isset($_FILES['file_data'])) {
$originalName = $_FILES['file_data']['name'];
$tempPath = $_FILES['file_data']['tmp_name'];
$fileExtension = strtolower(pathinfo($originalName, PATHINFO_EXTENSION));
// Hedef tam dosya yolunu oluşturuyoruz.
$targetPath = $file . '/' . $originalName;
// Sadece png, jpg ve jpeg dosya uzantılarını işleme alıyoruz. İsterseniz başka uzantıları da ekleyebilirsiniz.
if (in_array($fileExtension, ['png', 'jpg', 'jpeg'])) {
$apiKey = "api_key_buraya"; // TinyPNG API anahtarınız.
// cURL oturumunu başlatıyoruz.
$ch = curl_init();
curl_setopt_array($ch, [
CURLOPT_URL => "https://api.tinify.com/shrink",
CURLOPT_USERPWD => "api:" . $apiKey,
CURLOPT_POSTFIELDS => file_get_contents($tempPath),
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HEADER => true,
CURLOPT_SSL_VERIFYPEER => true
]);
// İsteği gerçekleştiriyoruz
$response = curl_exec($ch);
// Başlık (Header) ve Gövde (Body) kısımlarını birbirinden ayırıyoruz
$headerSize = curl_getinfo($ch, CURLINFO_HEADER_SIZE);
$body = substr($response, $headerSize);
$data = json_decode($body, true);
curl_close($ch);
// TinyPNG optimizasyonu başarılı olduysa ve indirme URL'si geldiyse
if (isset($data['output']['url'])) {
// Optimize edilmiş resmi doğrudan API sunucusundan çekip hedef klasöre kaydediyoruz
file_put_contents($targetPath, file_get_contents($data['output']['url']));
echo "<span class=\"success\"><b>" . htmlspecialchars($originalName) . " görseli optimize edildi.</b></span>";
} else {
// API hatası durumunda (Örn: Kota dolması) resmi kaybetmemek için orijinal haliyle kaydediyoruz
move_uploaded_file($tempPath, $targetPath);
$errorMessage = $data['error'] ?? 'Bilinmeyen Hata';
echo "<span class=\"error\"><b>TinyPNG Hatası (" . htmlspecialchars($errorMessage) . "). Görsel orijinal haliyle kaydedildi.</b></span>";
}
} else {
// Dosya uzantısı png, jpg veya jpeg değilse doğrudan sunucuya taşıyoruz
move_uploaded_file($tempPath, $targetPath);
}
}
?>Sonuç
Bu basit cURL entegrasyonu sayesinde web sitenizin disk alanından tasarruf edebilir ve sayfa açılış hızlarınızı ciddi oranda artırabilirsiniz. Kullanıcılarınız sitenizde gezinirken daha az veri harcar ve daha hızlı bir deneyim yaşar.
