Cara Mengatasi Headers Already Sent di PHP
Headers already sent terjadi ketika PHP sudah mengirim output ke browser, lalu kode masih mencoba mengubah header HTTP dengan header(), setcookie(), atau session_start(). Solusi cepatnya: pindahkan session_start(), header(), dan setcookie() ke bagian paling atas sebelum HTML, spasi, echo, atau include yang menghasilkan output.
Error lengkapnya sering terlihat seperti ini:
Bagi pemula, pesan ini membingungkan karena yang terlihat hanya fungsi header() atau session_start(). Padahal sumber masalahnya sering berada beberapa baris sebelumnya, bahkan bisa berasal dari file lain yang di-include.
Kenapa Header Harus Dikirim Lebih Dulu?
Saat browser menerima halaman, server mengirim dua bagian:
Header berisi informasi seperti status response, cookie, lokasi redirect, dan tipe konten. Body berisi HTML yang tampil di layar.
Begitu PHP mengirim body, header dianggap selesai. Setelah itu PHP tidak bisa lagi berkata "redirect ke halaman lain" atau "buat cookie baru".
Contoh yang salah:
HTML sudah keluar duluan, sehingga redirect gagal.
Penyebab Paling Umum
Solusi Utama: Pindahkan Logika ke Atas
Untuk halaman login, proses redirect harus dilakukan sebelum HTML ditampilkan.
Pola ini aman karena semua operasi header selesai sebelum HTML dikirim.
Solusi untuk session_start()
session_start() juga mengirim header cookie session. Karena itu, posisinya harus sangat awal.
Salah:
Benar:
Jika session kamu tetap bermasalah setelah posisi session_start() benar, baca panduan Kenapa Session PHP Tidak Tersimpan?.
Solusi untuk File Include
Masalah sering berasal dari file yang di-include, misalnya config.php.
Salah:
Komentar HTML di atas sudah dianggap output. Jika config.php di-include sebelum header(), redirect bisa gagal.
Benar:
Untuk file PHP murni yang hanya berisi konfigurasi atau function, kamu juga boleh tidak menutup dengan ?> agar tidak ada spasi tidak sengaja di akhir file.
Solusi untuk Redirect Setelah Simpan Data
Pola umum setelah submit form adalah Post/Redirect/Get. Setelah data berhasil disimpan, redirect user ke halaman lain agar form tidak terkirim ulang saat refresh.
Perhatikan bahwa tidak ada HTML sebelum blok proses POST.
Cara Menemukan Output yang Terlanjur Keluar
Pesan error biasanya memberi petunjuk:
Buka file dan baris tersebut. Cari:
- teks di luar
<?php ?> - spasi atau baris kosong sebelum
<?php echo,print_r(),var_dump()- warning PHP lain yang tampil sebelum redirect
- file include yang menampilkan HTML
Jika output berasal dari warning PHP lain, perbaiki warning itu dulu. Untuk dasar penanganan error, baca Error Handling.
Output Buffer sebagai Solusi Sementara
PHP punya output buffering dengan ob_start(). Ini menahan output sementara sebelum dikirim ke browser.
Namun untuk pemula, jangan jadikan ini solusi utama. Lebih baik rapikan struktur file: proses dulu, tampilkan HTML belakangan. Output buffer berguna untuk kasus tertentu, tetapi bisa menutupi struktur kode yang berantakan.
Pola Struktur Halaman yang Aman
Gunakan urutan ini untuk halaman PHP biasa:
Contoh:
Jika project makin besar, pertimbangkan pola Front Controller Pattern agar setup session, database, dan middleware tidak tercecer di banyak file.
Kesalahan yang Sering Terjadi
1. Menaruh session_start() di dalam template
Template biasanya sudah berisi HTML. Pindahkan session_start() ke file utama paling atas.
2. Debug dengan echo sebelum redirect
Jika butuh debug, gunakan log:
3. Lupa exit setelah header('Location: ...')
header() hanya mengirim instruksi redirect. Kode di bawahnya masih bisa berjalan jika tidak dihentikan.
4. Ada spasi sebelum tag pembuka PHP
Salah:
Benar:
5. File include menutup PHP lalu menyisakan spasi
Untuk file konfigurasi, helper, atau class, tidak wajib menulis tag penutup ?>.
FAQ
Apakah headers already sent selalu karena header()?
Tidak. Error ini juga bisa muncul karena session_start() atau setcookie(), karena keduanya perlu mengirim header HTTP.
Kenapa error menunjuk file yang berbeda?
Karena output pertama bisa berasal dari file include. Misalnya login.php memanggil config.php, lalu config.php punya spasi sebelum <?php.
Apakah ob_start() aman digunakan?
Aman untuk kasus tertentu, tetapi jangan dijadikan kebiasaan pertama. Struktur kode yang benar lebih mudah dipelihara.
Apakah file PHP harus ditutup dengan ?>?
Untuk file PHP murni, tidak harus. Banyak developer sengaja tidak menutupnya untuk mencegah spasi tidak sengaja setelah tag penutup.
Bagaimana cara redirect yang benar setelah login?
Panggil session_start() di atas, validasi login sebelum HTML, set $_SESSION, panggil header('Location: ...'), lalu exit.