Menu

PHP file_get_contents(): Dosyayı Bir Dizgeye Okuma

file_get_contents('notes.txt') bütün bir dosyayı okur ve tek bir dizge olarak, okuyamazsa false döndürür. Eşi file_put_contents() bir dizgeyi bir dosyaya yazar, file() ise satırları bir dizi olarak döndürür.

Bu sayfada çalıştırılabilir editörler var - düzenle, çalıştır ve sonucu anında gör.

file_get_contents('notes.txt') bütün dosyayı okur ve tek bir dizge olarak döndürür. Dosya okunamazsa false döndürür. Yazmak için dosyayı oluşturan veya içindekini değiştiren file_put_contents('notes.txt', $text) kullanın.

Çıktı:

Buy milk
Call Ada
Write docs
29 bytes
3 lines

Blok üzerinde çalışacak bir dosyası olsun diye önce notes.txt dosyasını yazar, sonra geri okur. 'notes.txt' gibi bir yol geçerli çalışma dizinine göredir; bir web uygulamasında yolu betiğin kendi klasöründen __DIR__ . '/notes.txt' ile oluşturun.

file_put_contents() ile yazma ve ekleme

file_put_contents() yazılan bayt sayısını, başarısızlıkta false döndürür. Varsayılan olarak dosyanın üzerine yazar. FILE_APPEND bayrağı bunun yerine sona ekler, basit loglar bu şekilde çalışır; LOCK_EX ise iki isteğin aynı anda yazmasını önler:

Çıktı:

Wrote 8 bytes
started
step 1 done
step 2 done

replaced

abc
5 bytes

Bir diziyi saklayıp dizi olarak geri almak için onu json_encode() ile JSON olarak yazın ve json_decode() ile okuyun.

file() ile bir dosyayı satır satır okuma

file() bir dosyayı her elemanı bir satır olan bir diziye okur. FILE_IGNORE_NEW_LINES vermedikçe her satır sonundaki yeni satır karakterini korur; FILE_SKIP_EMPTY_LINES ise boş satırları atar (yalnızca FILE_IGNORE_NEW_LINES ile birlikte çalışır):

Çıktı:

string(9) "Buy milk
"
1. Buy milk
2. Call Ada
3. Write docs
3 tasks

file() ve file_get_contents() dosyanın tamamını belleğe yükler. Yapılandırma dosyaları ve birkaç megabaytlık loglar için bu sorun değildir. Yüzlerce megabaytlık bir dosya için onu bunun yerine fopen() ve fgets() ile her seferinde bir satır okuyun.

Okumadan önce dosyanın var olup olmadığını kontrol etme

Dosya eksikse file_get_contents() false döndürür ve PHP bir uyarı yazdırır:

Warning: file_get_contents(missing.txt): Failed to open stream: No such file or directory in /home/index.php on line 2

Önce is_file() (var olan ve dizin olmayan bir dosya) veya file_exists() (bir dosya veya dizin) ile kontrol edin ve sonucu her zaman === false ile karşılaştırın, çünkü boş bir dosya da falsy olan "" döndürür:

Çıktı:

empty.txt   exists file 
missing.txt missing 
.           exists directory 
Cannot read missing.txt, using defaults
bool(false)
bool(true)
0 bytes

Uyarıyı @file_get_contents() ile gizlemeyin. Önce kontrol etmek ya da false durumunu ele almak, başka bir şey yanlış gittiğinde hatayı görünür tutar.

Bir dosyanın bir kısmını okuma

Dördüncü ve beşinci argümanlar başlanacak bayt konumu ve okunacak bayt sayısıdır. Negatif bir konum dosyanın sonundan sayar. Adlandırılmış argümanlar aradaki iki argümanı atlamanızı sağlar:

Çıktı:

HEADER
line 2
last line

Konumlar karakterleri değil baytları sayar. UTF-8'de bir Japonca karakter 3 bayttır, bu yüzden birinin ortasına denk gelen bir konum onu ikiye böler. Karakterlerle çalışmak için dizgenin tamamını okuyun ve mb_substr() kullanın.

Bir metin dosyasını bir web sayfasında gösterme

Dosya içerikleri metindir ve HTML'e yazdırılan metin kaçışlanmalıdır, yoksa dosyadaki bir < bir etikete dönüşür. htmlspecialchars() onu kaçışlar ve nl2br() yeni satırları <br> etiketlerine çevirir. Çalıştırın ve Page sekmesine bakın:

htmlspecialchars() kısmını kaldırın ve tekrar çalıştırın: sayfa artık "v1.2: Fixed" noktasında biter, çünkü tarayıcı <title> ifadesini gerçek bir etiket olarak okur ve ardından gelen her şeyi sayfa başlığı olarak yutar. htmlspecialchars() sayfası bunun bir kullanıcının yazabildiği her şey için neden önemli olduğunu anlatır.

file_get_contents() ile bir URL okuma

allow_url_fopen etkinken (php.ini içinde varsayılan), file_get_contents() URL'leri de okur ve yanıt gövdesini döndürür. Bir akış bağlamı bir yöntem, başlıklar, bir gövde ve bir zaman aşımı ekler:

<?php
$html = file_get_contents('https://example.com/');

$context = stream_context_create([
    'http' => [
        'method'  => 'POST',
        'header'  => "Content-Type: application/json\r\n",
        'content' => json_encode(['name' => 'Ada']),
        'timeout' => 5,
        'ignore_errors' => true,   // return the body of 4xx/5xx responses too
    ],
]);

$response = file_get_contents('https://api.example.com/users', false, $context);
if ($response === false) {
    // DNS failure, timeout, or a refused connection
}

Yeniden denemeler, sınırlı yönlendirmeler ve net hata kodları için cURL veya Guzzle gibi bir HTTP istemci kütüphanesi daha iyi araçtır.

file_get_contents, file() ve fopen() karşılaştırması

İstediğinizKullanınBellek
Dosyanın tamamı tek bir dizge olarakfile_get_contents()Dosyanın tamamı
Satırlar bir dizi olarakfile($path, FILE_IGNORE_NEW_LINES)Dosyanın tamamı
Bir dosyayı tek çağrıda yazmak veya değiştirmekfile_put_contents()Yazdığınız veri
Bir loga satır eklemekfile_put_contents($path, $line, FILE_APPEND | LOCK_EX)Bir satır
Büyük bir dosyayı satır satır ya da CSV satırlarını okumakfgets() veya fgetcsv() ile fopen()Bir satır
Aynı açık dosyayı okumak ve yazmakr+, a+ veya c+ ile fopen()Okuduğunuz kadar

Tek çağrılık fonksiyonlar dosyayı sizin yerinize açar, okur veya yazar ve kapatır, bu yüzden doğru varsayılan onlardır. Dosya bellekte tutulamayacak kadar büyük olduğunda ya da işlemler arasında açık tutmanız gerektiğinde fopen() kullanın.

Sıkça Sorulan Sorular

PHP'de bir dosyayı bir dizgeye nasıl okurum?

file_get_contents('path/to/file.txt') çağırın. Dosyanın tamamını bir dizge olarak, dosya okunamazsa false döndürür, bu yüzden kullanmadan önce sonucu === false ile karşılaştırın.

PHP'de bir dosyaya nasıl ekleme yaparım?

FILE_APPEND bayrağını verin: file_put_contents('log.txt', "new line\n", FILE_APPEND);. O olmadan file_put_contents() dosyanın tamamını değiştirir. Birkaç istek aynı anda yazabiliyorsa LOCK_EX ekleyin (FILE_APPEND | LOCK_EX).

PHP'de bir dosyayı satır satır nasıl okurum?

Küçük dosyalar için file('data.txt', FILE_IGNORE_NEW_LINES) her elemanı bir satır olan bir dizi döndürür. Büyük dosyalar için onu fopen() ile açın ve bir while döngüsünde fgets() ile her seferinde bir satır okuyun; bu, bellekte yalnızca bir satır tutar.

file_get_contents neden false döndürüyor?

Dosya yoktur, yol düşündüğünüzden farklı bir dizine göredir ya da PHP'nin onu okuma izni yoktur. PHP ayrıca Failed to open stream: No such file or directory gibi bir uyarı yazdırır. is_file() ve is_readable() ile kontrol edin ve yolları __DIR__ ile oluşturun.

file_get_contents bir URL okuyabilir mi?

Evet, php.ini içinde allow_url_fopen etkin olduğunda: file_get_contents('https://example.com/') yanıt gövdesini döndürür. Başlıklar, POST verisi veya bir zaman aşımı için stream_context_create() ile bir bağlam verin; daha karmaşık her şey için cURL daha iyi hata yönetimi sağlar.

Coddy programlama dilleri çizimi

Coddy ile kodlamayı öğren

BAŞLA