Cara Mengatasi Eror "Header already sent" di PHP

Senin, 16 Sep 2019

Terkadang ketika anda mengetikkan skrip PHP kemudian menjalankannya timbul pesan eror yang muncul seperti berikut:
Warning: Cannot modify header information - headers already sent by (output started at /some/file.php:12) in /some/file.php on line 12
Mengapa eror ini muncul? dan Bagaimana cara mengatasinya?

Sebenarnya permasalahan eror ini muncul ketika anda memanggil salah satu fungsi yang mempengaruhi pembacaan tajuk (header) HTTP. Fungsi yang bisa mempengaruhi pembacaan tajuk diantaranya:
Cara Mengatasi Eror "Header already sent" di PHP
  • header / header_remove
  • session_start /session_regenerate_id
  • setcookie / setrawcookie


Penyebab

Eror Header Bisa Saja Terjadi diakibatkan kesalahan yang ditimbulkan oleh programmer secara

ketidaksengajaan:
  1. Adanya spasi atau whitespace sebelum <?php atau setelah ?>
  2. Pembacaan karakter UTF-8 Byte yang spesifik
  3. Berkaitan dengan eror yang lain

Kesengajaan:
  1. Memanggil fungsi echo, print atau fungsi lain yang menampilkan output
  2. Penulisan tag <html> sebelum kode script <?php sehingga dibaca sebagai output

Sebenarnya apa yang terjadi?

Sebenarnya script PHP otomatis tidak hanya dapat mengenerate kontent HTML, selain itu PHP juga mengirim kode HTTP/CGI header ke webserver. Bentuknya seperti contoh berikut:

HTTP/1.1 200 OK
Powered-By: PHP/5.3.7
Vary: Accept-Encoding
Content-Type: text/html; charset=utf-8

<html><head><title>PHP page output page</title></head>
<body><h1>Content</h1> <p>Some more output follows...</p>
and <a href="/"> <img src=internal-icon-delayed> </a>

Sedangkan konten output yang digenerate akan mengikuti header tersebut. PHP harus meneruskan header ke server web terlebih dahulu. Proses pengiriman header hanya bisa dilakukan sekali. Setelah double linebreak, php tidak akan pernah bisa mengubahnya lagi.

Saat PHP menerima output pertama saat pemanggilan halaman berisi fungsi (print, echo, <html>), itu akan membersihkan semua header yang dikumpulkan. Setelah itu dapat mengirim semua output yang diinginkan. Tetapi mengirimkan tajuk HTTP lebih lanjut tidak mungkin dilakukan.

Bagaimana Cara Mengetahui di Mana Kesalahan Output Terjadi?

Peringatan eror header() berisi semua informasi yang relevan untuk menemukan penyebab masalah, contohnya:

Warning: Cannot modify header information - headers already sent by (output started at /www/usr2345/htdocs/auth.php:52) in /www/usr2345/htdocs/index.php on line 12

Berarti kesalahan terjadi pada baris 12.

Cara Mengatasi masalah "Header already sent" di PHP

Karena Fungsi output

Penulisan output dari fungsi print dan echo akan menghalangi kemungkinan PHP untuk mengirim HTTP header. Agar eror tidak terjadi maka anda harus merubah struktur penulisan pesan. Pastikan fungsi yang mempengaruhi header dipanggil dulu sebelum output dari fungsi ditampilkan atau ditulis dibagian paling atas dokumen. Fungsi output kemudian bisa ditulis mengikuti dibawahnya, fungsi ouput antara lain:
  • print, printf, vprintf, echo
  • trigger_error, ob_flush, ob_end_flush, var_dump, print_r
  • readfile, flush, passthru, imagepng, imagejpeg dan fungsi yang didefinisikan oleh programmer.


Karena Penulisan HTML

Penulisan HTML di file .php terkadang juga menimbulkan masalah output. Penulisan yang mempengaruhi header harus ditulis dulu sebelum penulisan script asli <html>
Whitespace sebelum <?php atau sesudah ?>
Bila pesan eror menunjuk pada baris output di nomor 1, maka kebanyakan kasus penyebabnya adalah adanyaspasi atau whitespace, text atau HTML sebelum tag pembukaan <?php.
contoh: 
 <?php //ada spasi sebelum tanda "<?php .."
seharusnya
<?php //tidak ada spasi sebelum tanda "<?php.."
atau bisa juga terjadi setelah penutupan tag php 
?>
PHP biasanya langsung membaca singgle line break setelah tag penutup. Tetapi bila ada banyak baris whitespace atau tab biasanya akan tetap tidak dapat ditoleransi oleh PHP.

UTF-8 BOM

Terkadang ada masalah karakter yang tidak dapat terbaca oleh editor PHP sehingga saat anda melihat atau membaca kode PHP sepertinya tidak ada masalah. Tetapi sebenarnya browser membaca karakter tersebut sehingga memunculkan masalah eror. pada umumnya masalah seperti ini dapat diatasi dengan menggunakan script editor atau software editor programming yang khusus dirancang untuk proses pengkodean contohnya dengan notepad++, gedit, dreamweaver, visual studio code, dsb.

Eror menunjuk pada baris 0

Terkadang PHP extension atau setting php.ini menunjuk eror yang tidak kongkrit. Biasanya kasus tersebut terjadi pada:
Setting gzip atau untuk menghasilkan ouput yang lebih ringkas
Bisa juga terjadi pada saat meload doble extension= pada saat server PHP diaktifkan

Pesan Kesalahan Sebelumnya

Pesan kesalahan header bisa juga terjadi akibat pesan kesalahan pada baris sebelum peringatan muncul. Agar anda dapat menunda kesalahan atau menunda eksekusi pernyataan bisa memanfaatkan fungsi isset() atau tanda @.

logoblog

Tidak ada komentar:

Posting Komentar