PHP programlama dilinde dosya işlemleri, sunucu üzerinde bulunan dosyaları okumak, yeni dosyalar oluşturmak, dosyalara veri yazmak ve mevcut dosyaları silmek için kullanılır.
Örneğin bir web uygulamasında kullanıcıların gönderdiği mesajları metin dosyasına kaydetmek, günlük işlem kayıtlarını tutmak veya bir dosyada bulunan bilgileri ekranda görüntülemek için PHP'nin dosya işlemlerinden yararlanabiliriz.
PHP, dosyalarla çalışabilmemiz için fopen(), fread(), fwrite(), fclose(), file_get_contents(), file_put_contents(), file_exists() ve unlink() gibi hazır fonksiyonlar sunar.
Dosya işlemleri, PHP kodları aracılığıyla sunucunun dosya sisteminde bulunan dosyalar üzerinde işlem yapılmasını sağlar.
PHP ile aşağıdaki işlemleri gerçekleştirebiliriz:
PHP dosya işlemleri sunucu tarafında gerçekleştirilir. Bu nedenle işlem yapılacak dosyanın bulunduğu klasörde PHP'nin gerekli okuma veya yazma izinlerine sahip olması gerekir.
Örneklerimizde PHP dosyalarıyla aynı klasörde bulunan metin dosyalarını kullanacağız.
PHP'de dosya okuma ve yazma işlemleri gerçekleştirirken işlem yapılacak dosyanın konumunu belirtmemiz gerekir.
Bu işlemlerde kullanılan __DIR__, PHP'nin önceden tanımlanmış sihirli sabitlerinden (magic constants) biridir.
__DIR__, kullanıldığı PHP dosyasının bulunduğu klasörün tam yolunu verir.
Örneğin aşağıdaki kodu inceleyelim:
<?php
echo __DIR__;
?>
Örnek Ekran Çıktısı:
C:\xampp\htdocs\phpdersleri
Bu örnekte PHP dosyamızın XAMPP içerisindeki phpdersleri klasöründe bulunduğu varsayılmıştır.
__DIR__ ifadesini kullanarak PHP dosyamızla aynı klasörde bulunan başka bir dosyanın tam yolunu oluşturabiliriz.
<?php
$dosyaYolu = __DIR__ . "/bilgi.txt";
echo $dosyaYolu;
?>
Örnek Ekran Çıktısı:
C:\xampp\htdocs\phpdersleri/bilgi.txt
Burada nokta (.) operatörü kullanılarak klasör yolu ile dosya adı birleştirilmiştir.
Windows işletim sisteminde dosya yollarında hem / hem de \ karakterleri kullanılabildiği için bu şekilde oluşturulan yol PHP tarafından kullanılabilir.
Dosya işlemlerinde __DIR__ kullanılması zorunlu değildir.
Örneğin aşağıdaki şekilde de dosya oluşturabiliriz:
<?php
file_put_contents("bilgi.txt", "Merhaba PHP!");
?>
Ancak bu kullanımda dosya yolu, PHP'nin geçerli çalışma klasörüne göre değerlendirilir. Geçerli çalışma klasörü her zaman kodun bulunduğu klasör olmayabilir.
Bu nedenle özellikle birden fazla dosyadan oluşan projelerde __DIR__ kullanmak daha güvenilir bir yöntemdir.
Örneğin projemizin klasör yapısı aşağıdaki gibi olsun:
phpdersleri/
│
├── index.php
│
└── dosyalar/
└── bilgi.txt
index.php dosyasından dosyalar klasöründeki bilgi.txt dosyasına aşağıdaki şekilde erişebiliriz:
<?php
$dosyaYolu = __DIR__ . "/dosyalar/bilgi.txt";
$icerik = file_get_contents($dosyaYolu);
if ($icerik !== false) {
echo htmlspecialchars($icerik, ENT_QUOTES, "UTF-8");
}
?>
Bu örnekte __DIR__ ile PHP dosyasının bulunduğu klasör belirlenmiş, ardından dosyalar klasöründeki bilgi.txt dosyasının yolu oluşturulmuştur.
Özetle: __DIR__, PHP dosyasının bulunduğu klasörün tam yolunu verir. Dosya okuma, yazma ve dosya dahil etme işlemlerinde doğru dosya yolunu oluşturmak için kullanılır.
fopen() fonksiyonu, bir dosyayı belirtilen işlem modunda açmak için kullanılır.
Genel kullanım şekli aşağıdaki gibidir:
<?php
$dosya = fopen("dosya.txt", "w");
?>
Burada dosya.txt işlem yapılacak dosyanın adını, w ise dosyanın hangi modda açılacağını belirtir.
Dosya başarıyla açılırsa fopen() fonksiyonu dosya üzerinde işlem yapmamızı sağlayan bir kaynak döndürür. İşlem başarısız olursa false döndürür.
| Mod | Açıklama |
|---|---|
| r | Dosyayı yalnızca okumak için açar. Dosya mevcut olmalıdır. |
| r+ | Dosyayı okumak ve yazmak için açar. Dosya mevcut olmalıdır. |
| w | Dosyayı yazmak için açar. Mevcut içeriği siler, dosya yoksa oluşturur. |
| w+ | Dosyayı okumak ve yazmak için açar. Mevcut içeriği siler, dosya yoksa oluşturur. |
| a | Dosyanın sonuna veri eklemek için açar. Dosya yoksa oluşturur. |
| a+ | Dosyayı okumak ve sonuna veri eklemek için açar. Dosya yoksa oluşturur. |
| x | Yeni dosya oluşturup yazmak için açar. Dosya zaten varsa başarısız olur. |
Önemli: w ve w+ modları, dosya zaten mevcutsa içeriğini açılış sırasında siler. Bu nedenle mevcut verilerin korunması gerekiyorsa a modu tercih edilebilir.
fwrite() fonksiyonu, fopen() ile açılmış bir dosyaya veri yazmak için kullanılır.
Öncelikle dosya yazma modunda açılır. Ardından fwrite() ile veri yazılır ve fclose() ile dosya kapatılır.
<?php
$dosya = fopen(__DIR__ . "/bilgi.txt", "w");
if ($dosya !== false) {
fwrite($dosya, "PHP dosya işlemleri öğreniyorum.");
fclose($dosya);
echo "Dosya oluşturuldu ve veri yazıldı.";
} else {
echo "Dosya açılamadı.";
}
?>
Bu kod çalıştırıldığında aynı klasörde bilgi.txt isimli bir dosya oluşturulur.
Dosyanın içeriği aşağıdaki gibi olacaktır:
PHP dosya işlemleri öğreniyorum.
Dosya zaten mevcutsa önceki içeriği silinerek yeni metin yazılır.
fclose() fonksiyonu, fopen() ile açılan dosyayı kapatmak için kullanılır.
Dosya üzerinde yapılacak işlemler tamamlandıktan sonra dosyanın kapatılması iyi bir programlama alışkanlığıdır.
<?php
$dosya = fopen(__DIR__ . "/ornek.txt", "w");
if ($dosya !== false) {
fwrite($dosya, "Merhaba PHP!");
fclose($dosya);
echo "İşlem tamamlandı.";
}
?>
Burada dosya açılmış, içerisine veri yazılmış ve işlem tamamlandıktan sonra kapatılmıştır.
fread() fonksiyonu, açılmış bir dosyadan belirtilen uzunlukta veri okumak için kullanılır.
Örneğin daha önce oluşturduğumuz bilgi.txt dosyasının içeriğini okuyalım.
<?php
$dosyaYolu = __DIR__ . "/bilgi.txt";
if (is_file($dosyaYolu)) {
$dosya = fopen($dosyaYolu, "r");
if ($dosya !== false) {
$boyut = filesize($dosyaYolu);
$icerik = $boyut > 0
? fread($dosya, $boyut)
: "";
fclose($dosya);
echo htmlspecialchars($icerik, ENT_QUOTES, "UTF-8");
} else {
echo "Dosya açılamadı.";
}
} else {
echo "Dosya bulunamadı.";
}
?>
Bu örnekte önce dosyanın varlığı kontrol edilmiş, ardından dosya okuma modunda açılmıştır.
filesize() fonksiyonu dosyanın boyutunu bayt cinsinden verir. fread() ise belirtilen uzunluktaki veriyi okur.
Dosya boşsa fread() çağrılmadan boş metin kullanılır. Dosyanın içeriği ekrana yazdırılırken htmlspecialchars() kullanılarak HTML karakterleri güvenli biçimde görüntülenir.
file_get_contents() fonksiyonu, bir dosyanın içeriğini tek bir işlemle okumak için kullanılır.
Bu fonksiyon sayesinde fopen(), fread() ve fclose() işlemlerini ayrı ayrı yazmamıza gerek kalmaz.
<?php
$dosyaYolu = __DIR__ . "/bilgi.txt";
if (is_file($dosyaYolu)) {
$icerik = file_get_contents($dosyaYolu);
if ($icerik !== false) {
echo htmlspecialchars($icerik, ENT_QUOTES, "UTF-8");
} else {
echo "Dosya okunamadı.";
}
} else {
echo "Dosya bulunamadı.";
}
?>
file_get_contents() fonksiyonu, özellikle küçük metin dosyalarının içeriğini okumak için oldukça kullanışlıdır.
Not: Büyük dosyaların tamamını belleğe almak yerine parça parça okumak daha uygun olabilir.
file_put_contents() fonksiyonu, bir dosyaya tek bir işlemle veri yazmak için kullanılır.
Dosya yoksa oluşturulur. Dosya mevcutsa varsayılan olarak önceki içerik değiştirilir.
<?php
$sonuc = file_put_contents(
__DIR__ . "/notlar.txt",
"Bugün PHP dosya işlemlerini öğrendik."
);
if ($sonuc !== false) {
echo "Dosyaya veri yazıldı.";
} else {
echo "Dosyaya yazılamadı.";
}
?>
Bu örnekte notlar.txt dosyasına metin yazılmıştır.
file_put_contents() fonksiyonu başarı durumunda yazılan bayt sayısını, başarısızlık durumunda ise false değerini döndürür.
Bazen dosyanın mevcut içeriğini silmeden yeni bilgiler eklememiz gerekir.
Örneğin bir uygulamada yapılan işlemleri tarih sırasıyla kayıt altına almak isteyebiliriz.
Bunun için fopen() fonksiyonunun a modunu veya file_put_contents() fonksiyonunun FILE_APPEND seçeneğini kullanabiliriz.
<?php
$dosya = fopen(__DIR__ . "/kayitlar.txt", "a");
if ($dosya !== false) {
fwrite($dosya, "Yeni bir kayıt eklendi." . PHP_EOL);
fclose($dosya);
echo "Kayıt eklendi.";
}
?>
Burada PHP_EOL sabiti, dosyaya işletim sistemine uygun satır sonu karakterini ekler.
<?php
$sonuc = file_put_contents(
__DIR__ . "/kayitlar.txt",
"Bir kayıt daha eklendi." . PHP_EOL,
FILE_APPEND | LOCK_EX
);
if ($sonuc !== false) {
echo "Yeni kayıt eklendi.";
}
?>
FILE_APPEND mevcut içeriği koruyarak dosyanın sonuna veri ekler.
LOCK_EX ise yazma işlemi sırasında özel dosya kilidi alınmasını ister. Bu seçenek aynı anda gerçekleşebilecek yazma işlemlerinin çakışma riskini azaltmaya yardımcı olur.
file_exists() fonksiyonu, belirtilen dosya veya klasör yolunun mevcut olup olmadığını kontrol eder.
<?php
$dosya = __DIR__ . "/bilgi.txt";
if (file_exists($dosya)) {
echo "Dosya mevcut.";
} else {
echo "Dosya bulunamadı.";
}
?>
Bu fonksiyon dosya işlemlerinden önce kontrol yapmak için kullanılabilir.
Yalnızca normal dosyaları kontrol etmek istediğimizde is_file() fonksiyonu da kullanılabilir.
filesize() fonksiyonu, bir dosyanın boyutunu bayt cinsinden öğrenmek için kullanılır.
<?php
$dosya = __DIR__ . "/bilgi.txt";
if (is_file($dosya)) {
$boyut = filesize($dosya);
if ($boyut !== false) {
echo "Dosya Boyutu: " . $boyut . " bayt";
}
} else {
echo "Dosya bulunamadı.";
}
?>
Dosya boyutunu kilobayt cinsinden göstermek için bayt değerini 1024'e bölebiliriz.
<?php
$dosya = __DIR__ . "/bilgi.txt";
if (is_file($dosya)) {
$boyut = filesize($dosya);
if ($boyut !== false) {
$kb = $boyut / 1024;
echo round($kb, 2) . " KB";
}
}
?>
Burada round() fonksiyonu kullanılarak sonuç iki ondalık basamağa yuvarlanmıştır.
unlink() fonksiyonu, sunucuda bulunan bir dosyayı silmek için kullanılır.
Bu işlem gerçekleştirilmeden önce dosyanın var olup olmadığı kontrol edilebilir.
<?php
$dosya = __DIR__ . "/silinecek.txt";
if (is_file($dosya)) {
if (unlink($dosya)) {
echo "Dosya başarıyla silindi.";
} else {
echo "Dosya silinemedi.";
}
} else {
echo "Dosya bulunamadı.";
}
?>
Dikkat: unlink() ile silinen dosya normal koşullarda geri dönüşüm kutusuna taşınmaz. Bu nedenle dosya silme işlemlerinde dikkatli olunmalıdır.
Şimdi öğrendiğimiz fonksiyonları kullanarak öğrencilerin uygulayabileceği beş farklı örnek hazırlayalım.
Bu uygulamada yeni bir metin dosyası oluşturacağız, dosyaya bilgi yazacağız ve ardından yazdığımız bilgiyi ekranda göstereceğiz.
<?php
$dosya = __DIR__ . "/ogrenci.txt";
$bilgi = "Ad Soyad: Ahmet Yılmaz" . PHP_EOL;
$bilgi .= "Sınıf: 11-A" . PHP_EOL;
$bilgi .= "Ders: Web Programlama";
$yazma = file_put_contents($dosya, $bilgi);
if ($yazma !== false) {
$icerik = file_get_contents($dosya);
if ($icerik !== false) {
echo nl2br(
htmlspecialchars($icerik, ENT_QUOTES, "UTF-8")
);
}
} else {
echo "Dosyaya yazılamadı.";
}
?>
Ekran Çıktısı:
Ad Soyad: Ahmet Yılmaz
Sınıf: 11-A
Ders: Web Programlama
Burada nl2br() fonksiyonu, metindeki satır sonlarını HTML'de satır atlamaya dönüştürür.
Bu uygulamada bir metin dosyasına öğrenci isimleri ekleyeceğiz. Her yeni isim dosyanın sonuna yazılacak.
<?php
$dosya = __DIR__ . "/ogrenciler.txt";
$ogrenciler = array(
"Ahmet",
"Ayşe",
"Mehmet",
"Zeynep"
);
foreach ($ogrenciler as $ogrenci) {
$sonuc = file_put_contents(
$dosya,
$ogrenci . PHP_EOL,
FILE_APPEND | LOCK_EX
);
if ($sonuc === false) {
echo "Kayıt sırasında hata oluştu.";
break;
}
}
echo "İşlem tamamlandı.";
?>
İşlem başarılı olduğunda ogrenciler.txt dosyasına dört isim eklenir.
Not: Sayfa her çalıştırıldığında aynı isimler yeniden eklenecektir. Bu uygulamanın amacı FILE_APPEND seçeneğinin çalışma mantığını göstermektir.
Bu uygulamada HTML formundan alınan bir mesajı metin dosyasına kaydedeceğiz.
Dosyanın adı mesaj.php olsun.
<?php
$bilgi = "";
if ($_SERVER["REQUEST_METHOD"] === "POST") {
$mesaj = trim($_POST["mesaj"] ?? "");
if ($mesaj !== "") {
$mesaj = str_replace(
array("\r", "\n"),
" ",
$mesaj
);
$kayit = date("Y-m-d H:i:s")
. " - "
. $mesaj
. PHP_EOL;
$sonuc = file_put_contents(
__DIR__ . "/mesajlar.txt",
$kayit,
FILE_APPEND | LOCK_EX
);
if ($sonuc !== false) {
$bilgi = "Mesajınız kaydedildi.";
} else {
$bilgi = "Mesaj kaydedilemedi.";
}
} else {
$bilgi = "Lütfen mesaj yazınız.";
}
}
?>
<!DOCTYPE html>
<html lang="tr">
<head>
<meta charset="UTF-8">
<title>Mesaj Kaydetme</title>
</head>
<body>
<h3>Mesaj Gönder</h3>
<p>
<?php
echo htmlspecialchars($bilgi, ENT_QUOTES, "UTF-8");
?>
</p>
<form method="post">
<textarea name="mesaj" rows="5" cols="40"
maxlength="500" required></textarea>
<br><br>
<button type="submit">Kaydet</button>
</form>
</body>
</html>
Bu uygulamada kullanıcı tarafından gönderilen mesaj, tarih ve saat bilgisiyle birlikte mesajlar.txt dosyasının sonuna eklenir.
Not: Bu örnek eğitim amaçlıdır. Gerçek bir web sitesinde mesaj uzunluğu sunucu tarafında da sınırlandırılmalı, spam önlemleri uygulanmalı ve özel mesaj dosyaları ziyaretçilerin doğrudan erişemeyeceği bir konumda saklanmalıdır.
Bu uygulamada bir metin dosyasındaki satırları okuyarak numaralı şekilde ekrana yazdıracağız.
Öncelikle dersler.txt dosyasını oluşturalım.
PHP
HTML
CSS
JavaScript
MySQL
Şimdi bu dosyanın içeriğini PHP ile okuyalım.
<?php
$dosya = __DIR__ . "/dersler.txt";
if (is_file($dosya)) {
$satirlar = file(
$dosya,
FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES
);
if ($satirlar !== false) {
foreach ($satirlar as $sira => $ders) {
echo ($sira + 1) . ". ";
echo htmlspecialchars(
$ders,
ENT_QUOTES,
"UTF-8"
);
echo "<br>";
}
}
} else {
echo "Dosya bulunamadı.";
}
?>
Ekran Çıktısı:
1. PHP
2. HTML
3. CSS
4. JavaScript
5. MySQL
Burada file() fonksiyonu dosyanın satırlarını bir dizi olarak okur. foreach döngüsüyle her satır ekrana yazdırılır.
Bu uygulamada bir işlem gerçekleştiğinde tarih ve saat bilgisiyle birlikte metin dosyasına kayıt ekleyeceğiz.
Bu tür kayıt dosyaları, uygulamaların çalışma durumunu takip etmek için kullanılabilir.
<?php
date_default_timezone_set("Europe/Istanbul");
$dosya = __DIR__ . "/gunluk.txt";
$tarih = date("d.m.Y H:i:s");
$islem = "Örnek işlem gerçekleştirildi.";
$kayit = "[" . $tarih . "] "
. $islem
. PHP_EOL;
$sonuc = file_put_contents(
$dosya,
$kayit,
FILE_APPEND | LOCK_EX
);
if ($sonuc !== false) {
echo "Günlük kaydı oluşturuldu.";
} else {
echo "Kayıt oluşturulamadı.";
}
?>
Bu kod her çalıştırıldığında gunluk.txt dosyasının sonuna yeni bir satır eklenir.
Örnek Dosya İçeriği:
[11.11.2026 12:00:00] Örnek işlem gerçekleştirildi.
[11.11.2026 12:05:00] Örnek işlem gerçekleştirildi.
[11.11.2026 12:10:00] Örnek işlem gerçekleştirildi.
Bu örnekteki tarih ve saat bilgileri temsili olarak verilmiştir. Gerçek kayıtlar kodun çalıştırıldığı zamana göre oluşturulur.
Uygulama 1: PHP ile kendiniz hakkında üç satırlık bilgi içeren bir metin dosyası oluşturunuz. Daha sonra bu dosyanın içeriğini ekrana yazdırınız.
Uygulama 2: Bir metin dosyasına beş farklı şehir adı ekleyiniz. Dosyadaki şehirleri foreach döngüsüyle listeleyiniz.
Uygulama 3: HTML formundan alınan öğrenci adını ve sınıfını metin dosyasına kaydeden bir PHP uygulaması hazırlayınız.
Uygulama 4: Bir dosyanın mevcut olup olmadığını kontrol eden, mevcutsa dosya boyutunu bayt ve kilobayt cinsinden gösteren uygulama geliştiriniz.
Uygulama 5: Bir dosyaya tarih ve saat bilgisiyle işlem kaydı ekleyen, ardından dosyadaki kayıtları listeleyen basit bir günlük sistemi hazırlayınız.
Bu dersimizde PHP programlama dilinde dosya okuma ve yazma işlemlerini öğrendik.
fopen(), fwrite() ve fclose() fonksiyonlarıyla dosya oluşturma ve veri yazma işlemlerini gerçekleştirdik. fread() ve file_get_contents() fonksiyonlarıyla dosya içeriklerini okuduk.
Ayrıca file_put_contents() ve FILE_APPEND kullanarak dosyaların sonuna yeni kayıtlar ekledik. file_exists(), filesize() ve unlink() fonksiyonlarıyla dosya kontrolü, boyut öğrenme ve silme işlemlerini inceledik.
Son olarak öğrendiğimiz fonksiyonları kullanarak öğrenci bilgisi kaydetme, mesaj saklama, dosyadaki satırları listeleme ve günlük kayıt sistemi oluşturma uygulamaları geliştirdik.
PHP dosya işlemleri; küçük kayıt uygulamaları, günlük dosyaları, rapor oluşturma ve çeşitli sunucu işlemlerinde kullanılmaktadır. Daha büyük ve ilişkisel veri yapılarında ise veritabanı sistemlerinden yararlanılır.
Örnekleri kendi bilgisayarınızda çalıştırarak dosya oluşturma, okuma ve yazma işlemlerini pekiştirebilirsiniz.
Toplam 50 Makale
Lütfen yorumlarınızda saygılı, yapıcı ve anlaşılır bir dil kullanın.
Küfür, hakaret ya da spam içerikler onaylanmaz.