Tanpa pesan error

Jika error_reporting atau display_errors -nya kamu disabled di php.ini, maka gak akan ada warning yang bakal muncul. Tapi kan tetep error, jadi harus diperbaiki.

Jadi, ketika header("Location:...") gagal redirect, tapi gak ada pesan error, tapi harus dibenerin, makanya itu warning harus diadain. Caranya, tambahin skrip ini di atas skrip utama:

error_reporting(E_ALL);
ini_set("display_errors", 1);

atau pake set_error_handler("var_dump"); jika dua skrip yang tadi gak jalan juga.

Ngomong-ngomong tentang redirect headers, lo harus sering pake ekspresi ini untuk final code paths:

exit(header("Location: /finished.html"));

yang akan nyetak pesan user dalam hal kesalahan header().

Output buffering sebagai solusi

Output buffering PHP bisa jadi solusi untuk meringankan masalah ini. Seringkali berkerja dengan baik, tapi jangan dijadikan pengganti utama dari struktur program aslinya. Tujuan utamanya adalah untuk meminimalisir pengiriman data yang terlalu besar ke webserver.

  1. Setingan output_buffering= dapat membantu. Konfigurasikan itu di php.ini atau melalui .htaccess atau bahkan melalui .even.ini dalam setup modern FPM/FastCGI.
    Ngejalanan itu teh bakal memperbolehkan PHP untuk nge-buffer output daripada ngoper langsung ke webserver dengan instan. PHP dengan demikian dapat mengagregasi header HTTP.

  2. Gunakan ob_start() di awal script. Fungsi ini bakal ngeksekusi semua skrip PHP sebelum output yang berupa raw HTML dicetak.

Periksa dengan headers_sent()

Lo selalu bisa pake headers_sent() untuk menyelidiki apakah bisa itu header dikirim. Berguna untuk nyetak info atau mengaplikasikan fallback.

if (headers_sent()) {
    die("Redirect gagal");
}
else{
    exit(header("Location: /user.php"));
}

Beberapa solusi fallback yang berguna:

HTML tag

Jika aplikasi lo secara struktural susah untuk dibenerin, gampangnya (tapi ini gak profesional) dengan pake tag <meta>.

<meta http-equiv="Location" content="http://example.com/">

atau dengan short delay:

<meta http-equiv="Refresh" content="2; url=../target.html">

Ini akan mengarah ke non-valid HTML ketika digunakan lewat <head>. Kebanyakan browser memperbolehkan.

JavaScript redirect

Bisa dipake untuk page redirect

location.replace("target.html");

Seringkali ini lebih ampuh daripada <meta>. Bergantung pada JavaScript-capable clients.

Kedua pendekatan tadi membuat fallback yang diperbolehkan ktika HTTP header() yang asli gagal. Idealnya, selalu gabungin ini dengan pesan yang user-friendly dan clickable link sebagai usaha terakhir (yang mana dilakukan oleh http_redirect() PECL extension lakukan).

Mengapa setcookie() dan session_start() juga terpengaruh

Karena keduanya harus ngirim HTTP header Set-Cookie:. Makanya, kondisi yang sama dengan header() eror ini terjadi, dan pesan eror nya juga sama untuk situasi output prematur.

(Tentu banyak yang terpengaruh juga dengan cookie yang di-disbled di browser, atau bahkan masalah proxy. Kegunaan session juga bergantung pada free disk space dan setingan lain dari php.ini).


Artikel asli bisa dibaca di: https://stackoverflow.com/questions/8028957/how-to-fix-headers-already-sent-error-in-php/8028979#8028979