Ce face headers_sent / headers_list
După prima ieșire (un echo, HTML sau chiar un spațiu), PHP trimite antetele către browser și nu le mai poate schimba. headers_sent îți spune dacă s-a întâmplat deja, ca să nu apelezi header, setcookie sau session_start degeaba.
Cu cei doi parametri primești și locul exact unde a început afișarea: numele fișierului și linia. Este cel mai rapid mod de a găsi spațiul sau echo-ul care strică redirecționarea.
headers_list() returnează lista antetelor pregătite pentru trimitere. În linia de comandă (CLI) lista este mereu goală.
Parametri
| Parametru | Descriere |
|---|---|
$filename |
Opțional. Variabilă în care se pune fișierul în care a început afișarea. |
$line |
Opțional. Variabilă în care se pune linia. |
Ce returnează
true dacă antetele au fost trimise, altfel false.
Exemple
Exemplul 1: Găsirea locului care a început afișarea
<?php
echo "Salut!";
if (headers_sent($fisier, $linie)) {
echo "<br>Antetele au plecat deja, din $fisier, linia $linie.";
} else {
header("Location: /contact/");
exit;
}
Rezultat în browser
Salut!
Antetele au plecat deja, din /var/www/site/index.php, linia 2.
Exemplul 2: Antetele pregătite pentru trimitere
<?php
header("Content-Type: text/plain; charset=utf-8");
header("Cache-Control: no-store");
setcookie("tema", "dark");
print_r(headers_list());
Rezultat în browser
Array
(
[0] => X-Powered-By: PHP/8.5.11
[1] => Content-Type: text/plain; charset=utf-8
[2] => Cache-Control: no-store
[3] => Set-Cookie: tema=dark
)
Greșeli frecvente
- Ascunzi eroarea cu
@header(...). Problema rămâne: redirecționarea nu se face. Găsește cuheaders_sent($fisier, $linie)locul care afișează prea devreme și mută codul.
Comenzi înrudite
header: Trimite un antet HTTP către browser: redirecționare, tipul conținutului, descărcare de fișier, cache.setcookie: Trimite browserului un cookie: o valoare mică pe care browserul o păstrează și o trimite înapoi la fiecare cerere.session_start: Pornește sau reia sesiunea vizitatorului, ca să poți păstra date între pagini în $_SESSION.