4 Aralık 2007 Salı

PHP ile Zip Fonksiyonları

Merhaba Webkolog takipçileri!

Web uygulamalarınızda büyük dosyalarla çalışırken veya birden fazla dosyayı tek bir paket halinde sunmak istediğinizde, dosya sıkıştırma devreye girer. Bu sayede hem disk alanı tasarrufu sağlanır hem de dosya transferleri daha hızlı gerçekleşir. PHP, sunucu tarafında zip dosyalarıyla çalışmamızı sağlayan özel fonksiyon setleri sunar. Bu makalede, PHP 5.2 ve öncesi versiyonlarda kullanabileceğimiz temel **zip fonksiyonlarına** odaklanacağım. Gelin, dosyalarınızı nasıl bir araya getireceğimizi ve sıkıştıracağımızı öğrenelim!


Önemli Not: Zip Fonksiyonları Hakkında

PHP'nin `zip_` önekli fonksiyonları, genellikle PECL uzantısı olarak gelir ve kurulum gerektirebilir. Ayrıca, PHP'nin daha yeni versiyonlarında (özellikle PHP 5.2 sonrası, PHP 5.3'ten itibaren) çok daha kapsamlı ve nesne yönelimli bir yaklaşımla **ZipArchive sınıfı** kullanılmaya başlanmıştır. Bu makale, özellikle PHP 5.2 ve daha eski ortamlar için geçerli olan `zip_` fonksiyon setini ele almaktadır. Yeni projelerinizde ZipArchive sınıfını kullanmanızı şiddetle tavsiye ederim, çünkü daha modern, güvenli ve zengin özellikler sunar.


1. Zip Dosyası Açma ve Kapatma

Bir zip dosyası üzerinde işlem yapabilmek için öncelikle onu açmamız, işimiz bittiğinde ise kapatmamız gerekir.


<?php
$zip_dosyasi_adi = 'ornek.zip';

// Test amaçlı bir zip dosyası oluşturalım
// Gerçekte bu dosya sunucunuzda var olmalı veya başka bir şekilde oluşturulmalı
$zip_olustur = new ZipArchive(); // Bu sınıf PHP 5.2 sonrası içindir, sadece örnek amaçlı kullanıyorum.
if ($zip_olustur->open($zip_dosyasi_adi, ZipArchive::CREATE | ZipArchive::OVERWRITE) === TRUE) {
    $zip_olustur->addFromString('test1.txt', 'Bu ilk test metni.');
    $zip_olustur->addFromString('dizin/test2.txt', 'Bu ikinci test metni.');
    $zip_olustur->close();
    echo "Örnek zip dosyası ('ornek.zip') oluşturuldu.<br>";
} else {
    echo "Örnek zip dosyası oluşturulamadı.<br>";
}


// Bir zip dosyasını okuma için açar: zip_open()
$zip = zip_open($zip_dosyasi_adi);

if (is_resource($zip)) {
    echo "Zip dosyası başarıyla açıldı: " . $zip_dosyasi_adi . "<br>";

    // Diğer işlemleri burada yaparız...

    // Zip dosyasını kapatır: zip_close()
    zip_close($zip);
    echo "Zip dosyası kapatıldı.<br>";
} else {
    echo "Zip dosyası açılamadı. Hata kodu: " . $zip . "<br>";
    echo "Dosya mevcut olmayabilir veya zip uzantısı yüklü olmayabilir.<br>";
}

// Oluşturulan örnek zip dosyasını temizleyelim
if (file_exists($zip_dosyasi_adi)) {
    unlink($zip_dosyasi_adi);
    echo "Oluşturulan zip dosyası temizlendi.<br>";
}
?>

2. Zip Dosyasının İçeriğini Okuma

Bir zip dosyasının içindeki her bir öğeyi (dosya veya dizin) döngüye alarak bilgilerini okuyabilir ve içeriklerine erişebiliriz.


<?php
$zip_dosyasi_adi = 'ornek_okuma.zip';

// Okuma örneği için test amaçlı bir zip dosyası oluşturalım
$zip_olustur = new ZipArchive();
if ($zip_olustur->open($zip_dosyasi_adi, ZipArchive::CREATE | ZipArchive::OVERWRITE) === TRUE) {
    $zip_olustur->addFromString('deneme1.txt', 'Bu ilk dosyanın içeriğidir.');
    $zip_olustur->addFromString('klasor/deneme2.txt', 'Bu ikinci dosyanın içeriğidir.');
    $zip_olustur->addFromString('html_ornek.html', '<h1>HTML Test</h1><p>Bu bir HTML dosyası içeriği.</p>');
    $zip_olustur->close();
    echo "Okuma örneği için zip dosyası oluşturuldu.<br>";
} else {
    die("Okuma örneği zip dosyası oluşturulamadı.");
}


// Zip dosyasını aç
$zip = zip_open($zip_dosyasi_adi);

if (is_resource($zip)) {
    echo "<h5>Zip Dosyası İçeriği:</h5>";
    // Bir zip dosyasındaki sonraki girişi okur: zip_read()
    while ($zip_entry = zip_read($zip)) {
        // Zip girişinin adını verir: zip_entry_name()
        $entry_name = zip_entry_name($zip_entry);
        echo "Dosya Adı: " . $entry_name . "<br>";

        // Zip girişinin sıkıştırılmamış boyutunu verir: zip_entry_filesize()
        echo "Sıkıştırılmamış Boyut: " . zip_entry_filesize($zip_entry) . " byte<br>";

        // Zip girişinin sıkıştırma yöntemini verir: zip_entry_compressionmethod()
        echo "Sıkıştırma Yöntemi: " . zip_entry_compressionmethod($zip_entry) . "<br>";

        // Zip girişinin sıkıştırılmış boyutunu verir: zip_entry_compressedsize()
        echo "Sıkıştırılmış Boyut: " . zip_entry_compressedsize($zip_entry) . " byte<br>";

        // Zip girişini okumak için açar: zip_entry_open()
        // mod parametresi 'r' (sadece okuma) olmalıdır.
        if (zip_entry_open($zip, $zip_entry, "r")) {
            echo "  -- Giriş açıldı.<br>";
            // Zip girişinden veri okur: zip_entry_read()
            // len: okunacak bayt sayısı, zip_entry_filesize() kadar okunur.
            $icerik = zip_entry_read($zip_entry, zip_entry_filesize($zip_entry));
            echo "  -- İçerik: " . htmlspecialchars($icerik) . "<br>"; // HTML etiketlerini güvenlik için temizleyelim

            // Zip girişini kapatır: zip_entry_close()
            zip_entry_close($zip_entry);
            echo "  -- Giriş kapatıldı.<br>";
        } else {
            echo "  -- Giriş açılamadı!<br>";
        }
        echo "<hr>";
    }
    zip_close($zip);
    echo "Zip dosyası kapatıldı.<br>";
} else {
    echo "Zip dosyası açılamadı.<br>";
}

// Oluşturulan örnek zip dosyasını temizleyelim
if (file_exists($zip_dosyasi_adi)) {
    unlink($zip_dosyasi_adi);
    echo "Oluşturulan zip dosyası temizlendi.<br>";
}
?>

PHP'nin `zip_` fonksiyonları, özellikle eski PHP versiyonları için, zip dosyalarını programatik olarak okuma ve içeriğini işleme konusunda temel bir yetenek sağlar. Büyük ölçekli veya karmaşık zip işlemleri için modern PHP sürümlerinde ZipArchive sınıfının çok daha esnek ve güçlü olduğunu unutmamanızı rica ederim. Ancak temel okuma ve bilgi alma işlemleri için bu fonksiyonlar işinizi görecektir.

Webkolog'u takipte kalın!

Hepinize bol kodlu ve keyifli öğrenme süreçleri dilerim!

0 yorum:

Yorum Gönder