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'.
Menulis dan menambahkan isi dengan file_put_contents()
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()
| Kebutuhanmu | Pakai | Memori |
|---|---|---|
| Seluruh file sebagai satu string | file_get_contents() | Seluruh file |
| Baris-barisnya sebagai array | file($path, FILE_IGNORE_NEW_LINES) | Seluruh file |
| Menulis atau mengganti file dalam satu panggilan | file_put_contents() | Data yang kamu tulis |
| Menambahkan satu baris ke log | file_put_contents($path, $line, FILE_APPEND | LOCK_EX) | Satu baris |
| Membaca file besar baris per baris, atau baris CSV | fopen() dengan fgets() atau fgetcsv() | Satu baris |
| Membaca dan menulis file yang sama selagi terbuka | fopen() 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.