1 Ağustos 2007 Çarşamba

PHP ile FTP Fonksiyonları

Merhaba Webkolog takipçileri!

Web uygulamaları geliştirirken, sık sık uzak sunucularla dosya transferi yapma ihtiyacı duyarız. Özellikle sitelerimizi yayınlamak, güncellemek veya yedeklemek gibi durumlarda **FTP (File Transfer Protocol)** büyük kolaylık sağlar. PHP, bize bu FTP işlemlerini doğrudan kodlarımız içinden yapabilmemiz için kapsamlı bir fonksiyon seti sunar. Bu fonksiyonlar sayesinde dosyaları yükleyebilir, indirebilir, dizinler oluşturabilir ve uzak sunucudaki dosya sistemini yönetebiliriz. Gelin, PHP ile FTP dünyasına bir göz atalım!


1. FTP Bağlantısı Oluşturma ve Yönetme

Bir FTP sunucusuyla etkileşim kurmadan önce, bir bağlantı kurmalı, kimlik doğrulaması yapmalı ve işimiz bittiğinde bağlantıyı kapatmalıyız.


<?php
// FTP sunucusu bilgileri (Örnek değerlerdir, kendi sunucu bilgilerinizle değiştirin)
$ftp_server = "ftp.example.com";
$ftp_user = "kullanici_adi";
$ftp_pass = "sifre";

// FTP bağlantısı açar: ftp_connect()
// Bağlantı başarısız olursa FALSE döner
$ftp_baglanti = ftp_connect($ftp_server);

if ($ftp_baglanti) {
    echo "FTP sunucusuna bağlanıldı: " . $ftp_server . "<br>";

    // Bir FTP bağlantısına giriş yapar: ftp_login()
    $login_sonuc = ftp_login($ftp_baglanti, $ftp_user, $ftp_pass);

    if ($login_sonuc) {
        echo "FTP sunucusuna giriş başarılı.<br>";

        // Pasif modu açma veya kapama için kullanılır: ftp_pasv()
        // Güvenlik duvarları arkasından bağlantı kurarken genellikle pasif mod gereklidir.
        if (ftp_pasv($ftp_baglanti, true)) {
            echo "Pasif mod ayarlandı.<br>";
        } else {
            echo "Pasif mod ayarlanamadı!<br>";
        }

        // Bağlanılan FTP sunucusunun sistem tipini döndürür: ftp_systype()
        $sistem_tipi = ftp_systype($ftp_baglanti);
        echo "FTP Sunucusu Sistemi: " . $sistem_tipi . "<br>";

        // FTP bağlantısını kapatır: ftp_close() veya ftp_quit()
        // Genellikle ftp_close() tercih edilir, ancak ikisi de aynı işi yapar.
        ftp_close($ftp_baglanti);
        echo "FTP bağlantısı kapatıldı.<br>";

    } else {
        echo "FTP sunucusuna giriş yapılamadı! Lütfen kullanıcı adı ve şifrenizi kontrol edin.<br>";
    }
} else {
    echo "FTP sunucusuna bağlanılamadı: " . $ftp_server . "<br>";
}
?>

2. Dosya Yükleme ve İndirme

FTP'nin temel amacı, yerel makinenizdeki dosyaları uzak sunucuya yüklemek veya sunucudan yerel makinenize indirmektir. Bu işlemleri ftp_put() ve ftp_get() ile yaparız.


<?php
// Sunucu bilgilerini tekrar tanımlayalım veya yukarıdaki örnekten alalım
$ftp_server = "ftp.example.com";
$ftp_user = "kullanici_adi";
$ftp_pass = "sifre";

$ftp_baglanti = ftp_connect($ftp_server);
if ($ftp_baglanti && ftp_login($ftp_baglanti, $ftp_user, $ftp_pass)) {
    ftp_pasv($ftp_baglanti, true);

    $yerel_dosya = "yerel_ornek.txt";
    $uzak_dosya = "/public_html/uzak_ornek.txt"; // Sunucudaki hedef yol

    // Yerel bir test dosyası oluşturalım
    file_put_contents($yerel_dosya, "Bu bir test dosyasıdır. FTP ile yüklenecek.");

    // Dosyayı FTP sunucusuna gönderir: ftp_put()
    // FTP_ASCII veya FTP_BINARY modları kullanılabilir. Metin dosyaları için ASCII, diğerleri için BINARY.
    if (ftp_put($ftp_baglanti, $uzak_dosya, $yerel_dosya, FTP_ASCII)) {
        echo $yerel_dosya . " başarıyla " . $uzak_dosya . " adresine yüklendi.<br>";
    } else {
        echo $yerel_dosya . " yüklenemedi.<br>";
    }

    echo "<hr>";

    $indirecek_uzak_dosya = "/public_html/uzak_ornek.txt"; // Sunucudan indirilecek dosya
    $indirecek_yerel_dosya = "indirilen_ornek.txt"; // Yerel makinedeki hedef isim

    // Bağlanılan FTP sunucusundan dosya alır: ftp_get()
    if (ftp_get($ftp_baglanti, $indirecek_yerel_dosya, $indirecek_uzak_dosya, FTP_ASCII)) {
        echo $indirecek_uzak_dosya . " başarıyla " . $indirecek_yerel_dosya . " olarak indirildi.<br>";
        echo "İndirilen dosya içeriği: " . file_get_contents($indirecek_yerel_dosya) . "<br>";
    } else {
        echo $indirecek_uzak_dosya . " indirilemedi.<br>";
    }

    // Açık olan bir dosyadan FTP sunucusuna yükleme: ftp_fput() (dosya işaretçisiyle)
    // Bu, özellikle büyük dosyalarla çalışırken veya dinamik içerik yüklerken faydalıdır.
    $yerel_dosya_handle = fopen("dinamik_veri.txt", "w+"); // w+ modu ile hem okunabilir hem yazılabilir aç
    fwrite($yerel_dosya_handle, "Bu dinamik olarak oluşturulmuş bir içerik.");
    fseek($yerel_dosya_handle, 0); // İşaretçiyi başa al

    if (ftp_fput($ftp_baglanti, "/public_html/dinamik_yuklenen.txt", $yerel_dosya_handle, FTP_ASCII)) {
        echo "Dinamik veri dosyası başarıyla yüklendi.<br>";
    } else {
        echo "Dinamik veri dosyası yüklenemedi.<br>";
    }
    fclose($yerel_dosya_handle); // Dosya işaretçisini kapat

    // Bağlanılan FTP sunucusundan dosyayı alır ve açık olan bir dosyaya kaydeder: ftp_fget()
    $indirecek_uzak_dosya2 = "/public_html/dinamik_yuklenen.txt";
    $yerel_dosya_handle2 = fopen("indirilen_dinamik.txt", "w+");

    if (ftp_fget($ftp_baglanti, $yerel_dosya_handle2, $indirecek_uzak_dosya2, FTP_ASCII)) {
        echo "Dinamik yüklenen dosya başarıyla indirildi (handle ile).<br>";
        fseek($yerel_dosya_handle2, 0); // İşaretçiyi başa al
        echo "İndirilen dinamik dosya içeriği: " . stream_get_contents($yerel_dosya_handle2) . "<br>";
    } else {
        echo "Dinamik yüklenen dosya indirilemedi (handle ile).<br>";
    }
    fclose($yerel_dosya_handle2);

    // Oluşturduğumuz yerel test dosyalarını temizleyelim
    unlink($yerel_dosya);
    unlink($indirecek_yerel_dosya);
    unlink("dinamik_veri.txt");
    unlink("indirilen_dinamik.txt");

    ftp_close($ftp_baglanti);
} else {
    echo "FTP bağlantısı veya giriş başarısız.<br>";
}
?>

3. Dizin ve Dosya Yönetimi

Uzak sunucudaki dizinleri değiştirmek, yeni dizinler oluşturmak, dizin içeriğini listelemek veya dosya/dizin silmek de yapabileceğimiz işlemler arasındadır.


<?php
// Sunucu bilgilerini tekrar tanımlayalım
$ftp_server = "ftp.example.com";
$ftp_user = "kullanici_adi";
$ftp_pass = "sifre";

$ftp_baglanti = ftp_connect($ftp_server);
if ($ftp_baglanti && ftp_login($ftp_baglanti, $ftp_user, $ftp_pass)) {
    ftp_pasv($ftp_baglanti, true);

    $yeni_klasor = "yeni_php_klasor";
    $silinecek_dosya = "/public_html/silinecek_dosya.txt"; // Bu dosyayı manuel olarak veya ftp_put ile oluşturabilirsiniz.
    $yeniden_adlandirilacak_eski = "/public_html/eski_ad.txt"; // Bu dosyayı manuel olarak oluşturun.
    $yeniden_adlandirilacak_yeni = "/public_html/yeni_ad.txt";

    // FTP sitesinde yeni bir dizin oluşturmak için: ftp_mkdir()
    if (ftp_mkdir($ftp_baglanti, $yeni_klasor)) {
        echo $yeni_klasor . " dizini başarıyla oluşturuldu.<br>";
    } else {
        echo $yeni_klasor . " dizini oluşturulamadı (zaten var olabilir veya izin hatası).<br>";
    }

    echo "<hr>";

    // FTP sunucusundaki klasörü değiştirir: ftp_chdir()
    if (ftp_chdir($ftp_baglanti, $yeni_klasor)) {
        echo "Dizin başarıyla " . $yeni_klasor . " olarak değiştirildi.<br>";

        // O an içinde bulunan klasörü döndürür: ftp_pwd()
        echo "Mevcut uzak dizin: " . ftp_pwd($ftp_baglanti) . "<br>";

        // Bir üst klasöre geçer: ftp_cdup()
        if (ftp_cdup($ftp_baglanti)) {
            echo "Bir üst dizine geçildi. Mevcut uzak dizin: " . ftp_pwd($ftp_baglanti) . "<br>";
        } else {
            echo "Üst dizine geçilemedi.<br>";
        }
    } else {
        echo $yeni_klasor . " dizinine geçilemedi.<br>";
    }

    echo "<hr>";

    // Verilen klasördeki dosyaların listesini döndürür (basit liste): ftp_nlist()
    $dosya_listesi = ftp_nlist($ftp_baglanti, "/public_html/"); // public_html altındaki dosyaları listele
    if ($dosya_listesi) {
        echo "public_html dizini içeriği (ftp_nlist):<br>";
        foreach ($dosya_listesi as $dosya) {
            echo "- " . $dosya . "<br>";
        }
    } else {
        echo "Dizin içeriği listelenemedi veya boş.<br>";
    }

    echo "<hr>";

    // Verilen klasördeki dosyaların detaylı listesini döndürür: ftp_rawlist()
    $detayli_liste = ftp_rawlist($ftp_baglanti, "/public_html/");
    if ($detayli_liste) {
        echo "public_html dizini detaylı içeriği (ftp_rawlist):<br>";
        foreach ($detayli_liste as $satir) {
            echo "- " . $satir . "<br>";
        }
    } else {
        echo "Detaylı dizin içeriği listelenemedi veya boş.<br>";
    }

    echo "<hr>";

    // Uzak bir sunucu üzerindeki bir dosyanın büyüklüğünü döndürür: ftp_size()
    // Test etmek için uzak_ornek.txt dosyasının yüklü olduğundan emin olun.
    if (file_exists("yerel_ornek.txt")) { // Yerel dosya boyutu
        $uzak_dosya_yolu = "/public_html/uzak_ornek.txt";
        $dosya_boyutu = ftp_size($ftp_baglanti, $uzak_dosya_yolu);
        if ($dosya_boyutu != -1) {
            echo $uzak_dosya_yolu . " boyutu: " . $dosya_boyutu . " byte.<br>";
        } else {
            echo $uzak_dosya_yolu . " boyutu alınamadı (dosya yok veya izin hatası).<br>";
        }
    }

    // Girilen dosyanın son değiştirilme tarihini döndürür: ftp_mdtm()
    if (file_exists("yerel_ornek.txt")) { // Yine yüklü bir dosya için
        $uzak_dosya_yolu = "/public_html/uzak_ornek.txt";
        $son_degistirme_timestamp = ftp_mdtm($ftp_baglanti, $uzak_dosya_yolu);
        if ($son_degistirme_timestamp != -1) {
            echo $uzak_dosya_yolu . " son değiştirme tarihi: " . date("Y-m-d H:i:s", $son_degistirme_timestamp) . "<br>";
        } else {
            echo $uzak_dosya_yolu . " son değiştirme tarihi alınamadı.<br>";
        }
    }

    echo "<hr>";

    // FTP sunucusundaki bir dosyanın adını değiştirir: ftp_rename()
    // Örnek için uzak sunucuda eski_ad.txt diye bir dosya oluşturun.
    /*
    if (ftp_rename($ftp_baglanti, $yeniden_adlandirilacak_eski, $yeniden_adlandirilacak_yeni)) {
        echo $yeniden_adlandirilacak_eski . " başarıyla " . $yeniden_adlandirilacak_yeni . " olarak yeniden adlandırıldı.<br>";
    } else {
        echo $yeniden_adlandirilacak_eski . " yeniden adlandırılamadı.<br>";
    }
    */

    // Girilen dosyayı FTP sunucusundan siler: ftp_delete()
    // Örnek için uzak sunucuda silinecek_dosya.txt diye bir dosya oluşturun.
    /*
    if (ftp_delete($ftp_baglanti, $silinecek_dosya)) {
        echo $silinecek_dosya . " başarıyla silindi.<br>";
    } else {
        echo $silinecek_dosya . " silinemedi.<br>";
    }
    */

    // Klasör siler: ftp_rmdir() (klasör boş olmalı)
    // Örnek için uzak sunucuda yeni_php_klasor dizinini boşaltın.
    /*
    if (ftp_rmdir($ftp_baglanti, $yeni_klasor)) {
        echo $yeni_klasor . " dizini başarıyla silindi.<br>";
    } else {
        echo $yeni_klasor . " dizini silinemedi (boş olmayabilir veya izin hatası).<br>";
    }
    */

    ftp_close($ftp_baglanti);
} else {
    echo "FTP bağlantısı veya giriş başarısız.<br>";
}
?>

Ek Bilgiler ve Güvenlik Uyarıları

  • FTP, verileri şifrelemeden gönderdiği için hassas bilgiler (şifreler, özel veriler) için güvenli bir protokol değildir. Mümkünse SFTP veya FTPS gibi şifreli alternatifleri kullanmayı tercih edin. Ancak PHP 5.2'nin kapsamı gereği bu makalede FTP fonksiyonlarına odaklandım.
  • FTP bağlantısı sırasında bir hata oluşursa, fonksiyonlar genellikle `FALSE` döner. Bu dönüş değerlerini her zaman kontrol etmeli ve uygun hata yönetimi yapmalısınız.
  • Dosya ve dizin izinleri (chmod) FTP sunucusunda önemlidir. Yükleme veya silme işlemleri için doğru izinlere sahip olduğunuzdan emin olun.

PHP'nin FTP fonksiyonları, uzak sunucularla dosya alışverişi yapmanız gereken durumlarda size büyük esneklik ve kontrol sağlar. Bu fonksiyonları anlayarak ve doğru şekilde kullanarak, web uygulamalarınızın dosya yönetimi yeteneklerini önemli ölçüde artırabilirsiniz. Güvenlik faktörlerini göz önünde bulundurarak ve sağlam hata kontrolleri yaparak projelerinizde FTP'yi etkili bir şekilde kullanmaya başlayabilirsiniz!

Webkolog'u takipte kalın!

Hepinize bol kodlu ve başarılı projeler dilerim!

0 yorum:

Yorum Gönder