Yazılım

PHP Dosya İşlemleri: Okuma, Yazma ve Dosya Yönetimi

16 Mart 2026 9 dk okuma 8 görüntülenme

Veritabanından Önceki Son Çıkış: Dosyalarla Konuşmak

Merhaba, ben Buğrahan. PHP serimizin 8. bölümüne hoş geldiniz. Geçen yazımızda projenin her yerinden erişebildiğimiz süper globalleri konuşmuştuk. Bugün ise web geliştirme serüveninde çok kritik ama nedense hep biraz çekinilen bir konuya, PHP dosya işlemleri dünyasına dalıyoruz.

Yazılımla ilk tanıştığım 2005 yıllarında, veritabanı kurmak, MySQL ile bağlantı yapmak bana o kadar karmaşık gelirdi ki, yaptığım ilk form işlemlerini, ziyaretçi defterlerini hep basit metin dosyalarına (.txt) kaydederdim. İnanın bana, veritabanı öncesi hayat kurtarıcıdır bu dosyalar. Bugün Pixel Lab®'da devasa veritabanlarıyla çalışıyor olsak da, sistemin arka planında sessizce çalışan, hataları kaydeden log dosyalarımız her zaman o basit metin dosyalarıdır. Bir gece yarısı sunucuda neyin ters gittiğini anlamak istediğinizde, o log dosyası sizin ormandaki pusulanız olur.

Gelin, bu işlemleri hiç gözümüzde büyütmeden, sanki kamp ateşi etrafında bir şeyler pişiriyormuşuz gibi adım adım inceleyelim.

Mutfak Kuralları: Aç, İşlem Yap ve Mutlaka Kapat

Dosya işlemlerini her zaman ormandaki kamp mutfağıma benzetirim. Erzak çantanızı açarsınız, içinden malzemeyi alırsınız veya içine bir şey koyarsınız ve işiniz bitince o çantanın ağzını sıkıca kapatırsınız. Kapatmazsanız ne olur? Gece ayı gelir, erzaklarınızı darmadağın eder. Yazılımda da durum farksızdır; bir dosyayı açıp kapatmazsanız, sunucu belleğinde sızıntılara (memory leak) veya dosya kilitlenmelerine yol açarsınız.

Bu temel işlemi PHP'de fopen, fread, fwrite ve fclose dörtlüsüyle yapıyoruz.


<?php
// 1. ADIM: Dosyayı aç (Erzak çantasını aç)
// 'w' modu (write) dosyayı yazmak için açar. Dosya yoksa oluşturur, varsa İÇİNDEKİLERİ SİLER!
$dosya = fopen("notlar.txt", "w");

if ($dosya) {
    // 2. ADIM: İşlem yap (PHP fwrite kullanımı)
    $metin = "Kampa giderken alınacaklar: Çadır, uyku tulumu, kahve.\n";
    fwrite($dosya, $metin);
    
    // 3. ADIM: Mutlaka kapat! (Çantanın ağzını bağla)
    fclose($dosya);
    echo "Dosya başarıyla yazıldı ve kapatıldı.";
} else {
    echo "Eyvah! Dosya açılamadı.";
}
?>

Burada dikkatinizi çekmek istediğim çok önemli bir detay var: Modlar. fopen kullanırken ikinci parametre olarak verdiğimiz o küçük harf her şeyi değiştirir.

  • 'r' (Read): Sadece okumak için açar.
  • 'w' (Write): Yazmak için açar ama acımasızdır; dosyanın içindeki eski veriyi tamamen siler.
  • 'a' (Append): Benim en sevdiğimdir. Dosyanın sonuna ekleme yapar. Log tutarken hep bunu kullanırız.

Benim Favorim: Modern ve Kısa Yollar

Açıkçası, karmaşık bir işlem yapmayacaksam, o dörtlü fonksiyon grubunu pek kullanmam. Benim gibi sadeliği ve temiz kodu (Clean Code) seven biriyseniz, PHP'nin bize sunduğu harika iki kısayol var: file_get_contents ve file_put_contents.

Bu fonksiyonlar çantayı sizin yerinize açar, işlemi yapar ve siz söylemeden kapatır. PHP dosya oluşturma ve okuma işlemlerini tek satıra indirgerler.


<?php
// Hızlıca dosya oluştur ve içine yaz
$mesaj = "Bugün hava orman yürüyüşü için harika!";
// FILE_APPEND parametresi 'a' modu gibi davranır, eski veriyi silmez, sonuna ekler.
file_put_contents("gunluk.txt", $mesaj . PHP_EOL, FILE_APPEND);

// Hızlıca dosyayı oku
$okunan_veri = file_get_contents("gunluk.txt");
echo "Günlükte yazanlar: <br>" . $okunan_veri;
?>

Bu kadar basit! Çoğu küçük projede veya API'den gelen bir JSON verisini okurken file_get_contents hayat kurtarır.

Büyük Verilerle Başa Çıkmak: Satır Satır Okuma

Şimdi size yıllar önce yaptığım bir hatadan bahsedeyim. Sunucuda yaklaşık 2 GB boyutunda bir hata log dosyası birikmişti. Ben de "Şu logları ekrana basayım da neymiş göreyim" diyerek safça file_get_contents("error_log.txt") komutunu çalıştırdım. Sonuç? Sunucunun belleği (RAM) saniyeler içinde doldu ve site çöktü. Çünkü bu fonksiyon, dosyanın tamamını tek seferde hafızaya almaya çalışır.

Eğer büyük bir dosyayla uğraşıyorsanız, onu bir kitabı okur gibi satır satır okumalısınız. İşte burada fgets devreye girer.


<?php
// Dosyayı okuma modunda açıyoruz
$buyukDosya = fopen("dev_log.txt", "r");

if ($buyukDosya) {
    // feof (End Of File) dosyanın sonuna gelip gelmediğimizi kontrol eder
    while (!feof($buyukDosya)) {
        // Satır satır okuyup belleği yormuyoruz
        $satir = fgets($buyukDosya);
        echo $satir . "<br>";
    }
    fclose($buyukDosya);
}
?>

Bu yöntemle 10 GB'lık bir dosyayı bile sunucunuzu yormadan, tereyağından kıl çeker gibi okuyabilirsiniz.

Ormanda Yolunu Bulmak: Dosya ve Dizin Yönetimi

Bir dosyanın içine bir şeyler yazmadan veya onu silmeden önce, o dosyanın orada olup olmadığından emin olmalısınız. Aksi takdirde PHP size hiç hoşlanmayacağınız hata mesajları fırlatır. Dosyaları manipüle ederken en sık kullandığım kontrol fonksiyonları şunlardır:

  • file_exists(): Bir dosya veya klasörün var olup olmadığını kontrol eder.
  • is_dir(): Hedefin bir klasör olup olmadığını söyler.
  • mkdir(): Yeni bir klasör oluşturur.
  • unlink(): Bir dosyayı acımadan siler (Geri dönüşüm kutusuna atmaz, kalıcı siler!).

Gelin bu komutları bir senaryoda birleştirelim:


<?php
$klasorAdi = "yedekler";
$dosyaAdi = "eski_yedek.zip";

// Klasör var mı diye bak, yoksa oluştur
if (!is_dir($klasorAdi)) {
    // 0755 klasör izinleridir, true ise iç içe klasör oluşturmaya izin verir
    mkdir($klasorAdi, 0755, true); 
    echo "Yedekler klasörü oluşturuldu.<br>";
}

// Dosya varsa sil (Temizlik iyidir)
if (file_exists($klasorAdi . "/" . $dosyaAdi)) {
    unlink($klasorAdi . "/" . $dosyaAdi);
    echo "Eski yedek silindi.";
} else {
    echo "Silinecek eski yedek bulunamadı.";
}
?>

Görünmez Tehlikeler: İzinler (CHMOD) ve Dosya Kilitleri (flock)

PHP dosya işlemleri yaparken her şey kodunuzun doğruluğuyla bitmez. Bazen kodu harika yazarsınız ama ekranda "Permission denied" (Erişim reddedildi) hatası görürsünüz. Bu, sunucunun o dosyaya veya klasöre yazma yetkisi olmadığı anlamına gelir.

Linux tabanlı sunucularda dosya izinleri kritiktir. Genellikle klasörler için 0755, dosyalar için 0644 izinleri idealdir. Asla ama asla bir klasöre 0777 (herkese tam yetki) izni vermeyin. Bu, ormandaki çadırınızın kapısını ardına kadar açık bırakıp "İsteyen ayı girebilir" demekle aynı şeydir. Güvenlik zafiyeti yaratır.

Bir diğer önemli konu ise Çakışmalar. Düşünün ki sitenizde saniyede 100 kişi bir işlem yapıyor ve siz hepsini aynı log.txt dosyasına yazmaya çalışıyorsunuz. İki kullanıcı tam aynı milisaniyede dosyaya yazmaya çalışırsa dosya bozulabilir. Bunun önüne geçmek için flock (File Lock) kullanırız. Yani "Ben dosyaya yazıyorum, işim bitene kadar kapıyı kilitliyorum, diğerleri beklesin" deriz.

Pratik Uygulama: Kendi Log Sistemimizi Yazalım

Buraya kadar öğrendiklerimizi, kendi projelerimde de sıkça kullandığım basit ama çok sağlam bir Log (Kayıt) fonksiyonu yazarak taçlandıralım. Bu fonksiyon klasör yoksa oluşturacak, dosyayı kilitleyecek, yazacak ve kilidi açacak.


<?php
/**
 * Sisteme özel güvenli log tutma fonksiyonu
 * @param string $mesaj Kaydedilecek hata veya bilgi mesajı
 * @param string $tur Log türü (hata, bilgi, uyari)
 */
function sistemeLogYaz($mesaj, $tur = 'bilgi') {
    // Logların tutulacağı ana klasör
    $logKlasoru = __DIR__ . '/sistem_loglari';
    
    // Klasör yoksa güvenli izinlerle (0755) oluştur
    if (!is_dir($logKlasoru)) {
        mkdir($logKlasoru, 0755, true);
    }
    
    // Günün tarihine göre dosya adı belirle (Örn: 2023-10-25-hata.log)
    $tarih = date('Y-m-d');
    $dosyaYolu = $logKlasoru . '/' . $tarih . '-' . $tur . '.log';
    
    // Mesaja zaman damgası ekle
    $zaman = date('H:i:s');
    $formatliMesaj = "[{$zaman}] [{$tur}] : {$mesaj}" . PHP_EOL;
    
    // file_put_contents ile dosyaya yaz. 
    // FILE_APPEND: Sonuna ekle
    // LOCK_EX: Yazarken dosyayı kilitle (Exclusive Lock)
    file_put_contents($dosyaYolu, $formatliMesaj, FILE_APPEND | LOCK_EX);
}

// Hadi test edelim!
sistemeLogYaz("Kullanıcı veritabanına bağlanamadı.", "hata");
sistemeLogYaz("Yeni bir sipariş oluşturuldu.", "bilgi");

echo "Loglar başarıyla sistem_loglari klasörüne yazıldı.";
?>

İşte bu kadar! Bu fonksiyonu alıp projelerinizde gönül rahatlığıyla kullanabilirsiniz. Hem güvenli, hem düzenli hem de yüksek trafikli anlarda bile LOCK_EX sayesinde dosyalarınızın bozulmasını engeller.

Dosyaları Kapatırken... ve Yeni Bir Kapıyı Aralarken

Bugün PHP'de dosyalarla konuşmayı, onlara veri yazmayı ve içindekileri güvenle okumayı öğrendik. Gördüğünüz gibi aslında korkulacak hiçbir şey yok. Sadece doğru fonksiyonu seçmek ve güvenlik kurallarına (izinlere) dikkat etmek yeterli. Dosya işlemleri, özellikle dışarıdan gelen verileri önbelleğe (cache) almak veya sistem hatalarını takip etmek için eşsiz bir yöntemdir.

Ancak bir noktadan sonra, örneğin 1 milyon kullanıcının bilgilerini tutmak veya "Adı 'Ahmet' olanları getir" gibi karmaşık aramalar yapmak istediğinizde metin dosyaları yetersiz kalacaktır. O zaman ne yapacağız? Bisikletimizi daha zorlu bir rotaya, verilerin birbiriyle ilişki kurduğu, devasa bilgilerin saniyeler içinde filtrelendiği o büyülü dünyaya çevireceğiz.

Bir sonraki yazımızda, yazılım dünyasının asıl kalbi olan veritabanlarına giriş yapacağız. O zamana kadar bol bol kod yazın, hata yapmaktan korkmayın ve eğer kafanız çok karışırsa bilgisayarı kapatıp doğada biraz yürüyüş yapmayı ihmal etmeyin. Görüşmek üzere!

Yorumlar

Henüz yorum yapılmamış. İlk yorumu siz yazın!

Yorum Yaz

E-posta adresiniz yayınlanmayacaktır.
0 / 2000