Headers already sent: come risolvere questo errore in PHP

di Lorenzo Neri
377 visualizzazioni

Headers already sent. È un errore molto frequente in PHP, ma in questo articolo vediamo come risolverlo e da cosa viene generato!

Ciao mi chiamo Lorenzo Neri e sono un informatico: realizzo contenuti per aiutare le persone a padroneggiare l’arte del nuovo millennio, ovvero l’informatica!

Non c’è alcun output prodotto prima inviare gli headers

Che significa questa frasona in tecnichese?!

Significa che quando stiamo usando funzioni che inviano oppure modificano gli headers HTTP queste devono essere invocate prima ancora che qualsiasi output venga prodotto!

Di per se, le funzioni di cui sto parlando sono header / header_remove, session_start / session_regenerate_id oppure setcookie / setrawcookie.

Parliamo invece dell’output e di che tipo può essere:

  • NON intenzionale
    • Spazi bianchi prima dell’indicatore “<?php” oppure dopo “?>”
    • Errori precedenti o warning
  • Intenzionale
    • Funzioni come print, echo e altre in grado di produrre un output a tutti gli effetti
    • Porzioni di HTML precedenti il codice PHP

Ora che abbiamo capito COME l’errore “Headers already sent” viene generato, cerchiamo di capire PERCHÈ.

Perchè succede tutto questo?

Per capire come mai succede tutto questo, dobbiamo capire come è strutturata una risposta tipica tramite l’uso dell’HTTP ed è anche questa una tecnica di debug 🙂

Oltre al codice HTML, gli script PHP in generale generano gli header HTTP:

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

<html><head><title>Pagina prodotta da uno script PHP</title></head>
<body><h1>Content</h1> <p>Qualche tag HTML...</p>
ciao <a href="/"> </a>

E di fatto, il codice HTML prodotto viene sempre a seguito degli header. C’è una regola base: una volta prodotto l’HTML e tutto il codice a seguito degli header, gli header stessi non possono essere inviati una seconda volta!

Perciò…

Come risolvere l’errore Headers already sent

Solitamente, la funzione “header()” genera dei warnings che fanno capire quale sia il problema.

Ad esempio:

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

Qui, fa riferimento alla linea 100 dello script in cui l’invocazione della funzione “header()” è fallita.

Cosa è successo di preciso?

La precisazione dentro il messaggio “output start at” ci fa capire dove l’output precedente è stato generato in questo caso alla riga 52 del file “login.php”.

Quindi, è lì che dobbiamo andare a vedere cosa è successo in definitiva.

Tuttavia, cerchiamo di darci un quadro generale atto a capire come risolvere la faccenda.

Come risolvere DAVVERO l’errore “Headers already sent” in PHP

Le cause sono bene o male queste.

1. Print, echo

Quando invocate, queste funzioni bloccano l’opportunità di inviare headers HTTP. Ciò che dovremmo fare è modificare il flusso di esecuzione dello script affinché questo NON succeda più.

Altre funzioni incriminate sono queste: printf, vprintf, trigger_error, ob_flush, ob_end_flush, var_dump, print_r, readfile, passthru, flush, imagepng, imagejpeg

2. HTML nudo e crudo

Ti sarà capitato almeno una volta di erogare in output dell’HTML vero e proprio dentro uno script PHP?

Anche quello blocca l’invio degli headers HTTP.

Per farti un esempio:

<!DOCTYPE html>
<?php
   //È già troppo tardi per inviare gli headers HTTP

Una soluzione che possiamo applicare per esempio, è usare variabili di tipo stringa temporanee per generarlo e in linea generale non bisogna mischiare la logica dello script con la generazione dell’HTML.

3. Spazi bianchi prima del tag “<?PHP”

Questo è molto utile se l’errore è generato alla riga numero 1 del tuo script.

Te ne accorgi facilmente:

 <?php
//Vedi che c'è uno spazio nella riga sopra?

Ironia della sorte, succede anche se il tuo file è impostato così:

?>
<?

4. Spazi bianchi dopo il tag “?>”

È l’antitesi del precedente 🙂

5. Nessun messaggio di errore

Con quest’ultima tipologia di soluzione al problema degli “headers already sent”, vediamo un alleato davvero potente per risolvere questo errore.

Se nel file “php.ini” hai le due voci “error_reporting” oppure “display_errors” disabilitate non vedrai alcun warning che ti possa aiutare!

Come risolvere allora?

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

Aggiungi queste due righe all’inizio del tuo script 😀

Continua a scoprire di più con questi articoli!

Lascia un commento

Questo sito potrebbe fare uso di cookie e siccome l'UE mi obbliga a fartelo presente, eccoti il classico banner dove puoi decidere come gestirli. Accetta Leggi di più