Menu

PHP file_get_contents(): Membaca File Menjadi String

file_get_contents('notes.txt') membaca seluruh isi file dan mengembalikannya sebagai satu string, atau false kalau gagal. Pasangannya, file_put_contents(), menulis string ke file, dan file() mengembalikan baris-barisnya sebagai array.

Halaman ini dilengkapi editor yang bisa dijalankan. Edit, jalankan, dan lihat output-nya seketika.

file_get_contents('notes.txt') membaca seluruh isi file dan mengembalikannya sebagai satu string. Kalau file-nya tidak bisa dibaca, hasilnya false. Untuk menulis, pakai file_put_contents('notes.txt', $text), yang membuat file baru atau mengganti isinya.

Output:

Buy milk
Call Ada
Write docs
29 bytes
3 lines

Blok ini menulis notes.txt lebih dulu lalu membacanya kembali, supaya ada file yang bisa diolah. Path seperti 'notes.txt' bersifat relatif terhadap direktori kerja saat ini; di aplikasi web, susun path dari folder script itu sendiri dengan __DIR__ . '/notes.txt'.

file_put_contents() mengembalikan jumlah byte yang ditulis, atau false kalau gagal. Secara bawaan, fungsi ini menimpa file. Flag FILE_APPEND justru menambahkan ke akhir file, begitulah cara kerja log sederhana, dan LOCK_EX mencegah dua request menulis pada saat yang sama:

Output:

Wrote 8 bytes
started
step 1 done
step 2 done

replaced

abc
5 bytes

Untuk menyimpan array dan mendapatkannya kembali sebagai array, tulis dalam format JSON dengan json_encode() lalu baca dengan json_decode().

Membaca file baris per baris dengan file()

file() membaca file ke dalam array dengan satu baris per elemen. Setiap baris tetap menyimpan baris barunya di akhir kecuali kamu memberikan FILE_IGNORE_NEW_LINES, dan FILE_SKIP_EMPTY_LINES membuang baris kosong (hanya bekerja bersama FILE_IGNORE_NEW_LINES):

Output:

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

file() dan file_get_contents() memuat seluruh file ke memori. Itu tidak masalah untuk file konfigurasi dan log berukuran beberapa megabyte. Untuk file berukuran ratusan megabyte, baca satu baris setiap kali dengan fopen() dan fgets().

Memeriksa apakah file ada sebelum membacanya

Saat file-nya tidak ada, file_get_contents() mengembalikan false dan PHP mencetak warning:

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

Periksa dulu dengan is_file() (file yang ada dan bukan direktori) atau file_exists() (file atau direktori), dan selalu bandingkan hasilnya dengan === false, karena file kosong mengembalikan "", yang juga bernilai falsy:

Output:

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

Jangan sembunyikan warning-nya dengan @file_get_contents(). Memeriksa lebih dulu, atau menangani false, membuat error tetap terlihat saat ada hal lain yang salah.

Membaca sebagian file

Argumen keempat dan kelima adalah offset byte tempat mulai membaca dan jumlah byte yang dibaca. Offset negatif dihitung dari akhir file. Named argument memungkinkanmu melewati dua argumen di antaranya:

Output:

HEADER
line 2
last line

Offset menghitung byte, bukan karakter. Di UTF-8, satu karakter Jepang berukuran 3 byte, jadi offset di tengahnya akan memotong karakter itu menjadi dua. Untuk bekerja dengan karakter, baca seluruh string lalu pakai mb_substr().

Menampilkan file teks di halaman web

Isi file adalah teks, dan teks yang dicetak ke HTML harus di-escape, kalau tidak, < di dalam file akan menjadi tag. htmlspecialchars() melakukan escape dan nl2br() mengubah baris baru menjadi tag <br>. Jalankan, lalu lihat tab Halaman:

Hapus htmlspecialchars() lalu jalankan lagi: halamannya sekarang berhenti di "v1.2: Fixed", karena browser membaca <title> sebagai tag sungguhan dan menelan semua sesudahnya sebagai judul halaman. Halaman htmlspecialchars() menjelaskan kenapa hal ini penting untuk apa pun yang bisa ditulis pengguna.

Membaca URL dengan file_get_contents()

Dengan allow_url_fopen aktif (bawaan di php.ini), file_get_contents() juga membaca URL dan mengembalikan body respons. Stream context menambahkan method, header, body, dan timeout:

<?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
}

Untuk retry, redirect dengan batas, dan kode error yang jelas, cURL atau library HTTP client seperti Guzzle adalah alat yang lebih baik.

file_get_contents vs file() vs fopen()

KebutuhanmuPakaiMemori
Seluruh file sebagai satu stringfile_get_contents()Seluruh file
Baris-barisnya sebagai arrayfile($path, FILE_IGNORE_NEW_LINES)Seluruh file
Menulis atau mengganti file dalam satu panggilanfile_put_contents()Data yang kamu tulis
Menambahkan satu baris ke logfile_put_contents($path, $line, FILE_APPEND | LOCK_EX)Satu baris
Membaca file besar baris per baris, atau baris CSVfopen() dengan fgets() atau fgetcsv()Satu baris
Membaca dan menulis file yang sama selagi terbukafopen() dengan r+, a+, atau c+Yang kamu baca

Fungsi satu panggilan itu membuka, membaca atau menulis, lalu menutup file untukmu, jadi itulah pilihan bawaan yang tepat. Gunakan fopen() saat file-nya terlalu besar untuk disimpan di memori atau kamu perlu membiarkannya tetap terbuka di antara beberapa operasi.

Pertanyaan yang sering diajukan

Bagaimana cara membaca file menjadi string di PHP?

Panggil file_get_contents('path/to/file.txt'). Fungsi ini mengembalikan seluruh isi file sebagai string, atau false kalau file-nya tidak bisa dibaca, jadi bandingkan hasilnya dengan === false sebelum dipakai.

Bagaimana cara menambahkan isi ke akhir file di PHP?

Berikan flag FILE_APPEND: file_put_contents('log.txt', "new line\n", FILE_APPEND);. Tanpa flag itu, file_put_contents() mengganti seluruh isi file. Tambahkan LOCK_EX (FILE_APPEND | LOCK_EX) saat beberapa request mungkin menulis pada waktu yang sama.

Bagaimana cara membaca file baris per baris di PHP?

Untuk file kecil, file('data.txt', FILE_IGNORE_NEW_LINES) mengembalikan array dengan satu baris per elemen. Untuk file besar, buka dengan fopen() lalu baca satu baris setiap kali dengan fgets() di dalam loop while, sehingga hanya satu baris yang disimpan di memori.

Kenapa file_get_contents mengembalikan false?

File-nya tidak ada, path-nya relatif terhadap direktori yang berbeda dari dugaanmu, atau PHP tidak punya izin untuk membacanya. PHP juga mencetak warning seperti Failed to open stream: No such file or directory. Periksa dengan is_file() dan is_readable(), dan susun path dari __DIR__.

Apakah file_get_contents bisa membaca URL?

Bisa, kalau allow_url_fopen diaktifkan di php.ini: file_get_contents('https://example.com/') mengembalikan body respons. Untuk header, data POST, atau timeout, berikan context dari stream_context_create(); untuk kebutuhan yang lebih rumit, cURL memberi penanganan error yang lebih baik.

Ilustrasi bahasa pemrograman di Coddy

Belajar coding dengan Coddy

Mulai