- Sat
- 17
- Jan
- 09
PHP Warning: Cannot modify header information – headers already sent
Di in Php Controls: +-close
Eliminare per sempre questo errore dai vostri script.
Uno degli errori che più mi hanno dato filo da torcere in passato, quando facevo i miei primi passi con il linguaggio php era il fatidico:
Warning: Cannot modify header information - headers already sent by (output started at /home/xxx/www.sito.it/htdocs/xxx/xxx.php:1) in /home/xxx/www.sito.it/htdocs/xxx/xxx.php on line 8
o anche
Warning: session_start() [function.session-start]: Cannot send session cache limiter - headers already sent (output started at /var/www/xxx/xxx.php:3) in /var/www/xxx/xxx.php on line 4
Questo errore è ancora oggi causa di malessere per molte persone che sviluppano in php, lo si può notare su vari forum del settore. In questo tutorial vedremo il perchè avviene questo errore e come risolverlo.
La Causa
La causa dell’errore risiede nell’utilizzo della funzione headers(): infatti questa funzione non permette che prima della sua chiamata sia presente un qualsiasi genere di output. Che significa? Per esempio non potete inserire un ‘echo’ o un ‘print’ o anche solo dei caratteri vuoti.
Il seguente è uno degli esempi più comuni che causano questo errore:
[non si vede ma qui c'è una linea bianca!]
<?php
/* Questo restituisce un errore */
header('Location: http://razorblade.netsons.org/');
?>
Cosa c’è di strano? La linea bianca nel file php inserita prima dell’apertura del tag php è a tutti gli effetti dell’output, ecco il perchè dell’errore
Anche il seguente esempio è comune causa di errore, un echo ( o vari echo ) prima di header()
<?php
/* Anche questo restituisce un errore */
echo 'io sono output';
header('Location: http://razorblade.netsons.org/');
?>
Otteniamo il seguente risultato:
io sono output Warning: Cannot modify header information - headers already sent by (output started at C:\wamp\www\head.php:3) in C:\wamp\www\head.php on line 4
Potrebbe anche accadere che nel vostro file non sia presente nessun genere di output prima di header() ma che siano presenti degli include ( o include_once ) o dei require ( o require_once ): in questo caso vi consiglio di controllare eventuali output all’interno dei files inclusi.
Risolvere il problema headers already sent
Ci sono molte soluzioni al problema. Se siete sul vostro server locale o avete i permessi di accedere al file di configurazione php, il php.ini, non dovete fare altro che impostare un valore per la proprietà output_buffering
I valori di questa proprietà possono essere ‘On’, ‘Off’ o un numero intero rappresentante i bytes. Il valore di performance è di 4096 ( 4 kilobytes ).
Cosa succede se abilitiamo l’output buffering? Com’è indicato sul php.ini prima della suddetta proprietà:
Output buffering allows you to send header lines (including cookies) even after you send body content, at the price of slowing PHP’s output layer a bit. You can enable output buffering during runtime by calling the output buffering functions. You can also enable output buffering for all files by setting this directive to On.
ovvero:
L’Output buffering ti permette di inviare linee (compresi i cookie), anche dopo che si invia il contenuto del corpo, al prezzo del rallentamento della produzione dell’output PHP. È possibile attivare l’Output buffering durante l’esecuzione ( a runtime ) usando le relative funzioni. È inoltre possibile abilitare l’Output buffering per tutti i file impostando questa direttiva su On.
Come potete leggere esiste la possibilità di attivare l’Output buffering a runtime usando delle specifiche funzioni, risolvendo l’errore ‘headers already sent’ senza mettere mani sul php.ini.
La funzione Ob_Start
Esistono diverse funzioni per la gestione dell’output, potete averne una visione completa cliccando qui. Di queste, quella che ci permette di eliminare il fastidioso errore senza sforzi è ob_start(). Richiamando ob_start() come primissima linea del nostro codice setteremo a runtime l’output buffering su on e non otterremo più errori.
Un caso particolare
Se nel vostro file non è presente nessun genere di output nemmeno negli eventuali files inclusi non rimane che la possibilità che in esso sia incluso un byte-order mark (BOM). Per risolvere il problema risalvate il vostro file PHP forzando la codifica ANSI ( cosa fattibile su windows per esempio con il normale blocco note, l’opzione per la selezione della codifica è resa disponibile scegliendo ’salva con nome’), ed il problema dovrebbe scomparire.
Considerazioni finali
Quando è possibile sarebbe forse meglio evitare di impostare l’output buffering su on al limite inserire il valore di 4096 bytes come descritto nel php.ini e cercare di fare attenzione a non inserire dell’output in precedenza alle chiamate della funzione header()
Spero con questo tutorial di aver tolto definitivamente ogni errore relativo ad headers already sent by, ogni commento è sempre gradito.
Related posts:
- PHP Header 301 Redirect – Moved Permanently, redirezione con Php Per vari motivi si ha la necessità di dover cambiare...
Related posts brought to you by Yet Another Related Posts Plugin.












[...] fonte: PHP Warning: Cannot modify header information – headers already … Author: [...]
Woow! Grazieeeeee! Finalmente ho risolto il problema (legato al discorso della codifica!!!) Questa pagina è da incorniciare!!!
Grazie per il commento, sono contento che tu abbia risolto
ti ringrazio, spiegazione molto dettagliata e fatta bene, ho risolto il problema.
ciao
Figurati, passa spesso a trovarmi. Ciao
avevo ormai rinunciato a capire come mai mi desse quell’errore, brevi e futili tentativi non avevano prodotto risultati. oggi mi sono imbattuto per caso in sta pagina, sia lode al signore. ora mi stampo la spiegazia e ci dò una letta approfondita!!!!!
Felice di essere stato così utile:)
[...] | razorblade posted under News Post correlati: Ajax file upload con [...]
Ottimo articolo.
Grazie 1000 per l’articolo, davvero molto utile! Spero di ricordarmi le tue direttive la prossima volta che ci sbatterò la testa.
Santo subito !
Eheheh grazie per il bel commento, perchè non dare un bel voto a questo articolo? ( pulsante ratings al termine dell’articolo, forse non si nota molto.. )
ottimo, risolto subito il problema
Io avrei un problema nel file della lingua, in cui ho tradotto l’intero sito. Mi viene un errore simile, quando io da connesso vado in preferenze nel mio account. Esce questo errore:
Cannot modify header information – headers already sent by (output started at /languages/language_list.php:1) (#2) in /temp/cpl_templates/%%FE^FEF^FEFFD061%%index.tpl.php.php on line 7
Mi dareste una mano non sono molto pratico…
Immagino che tu stia usando una qualche sorta di cms, ti conviene chiedere negli appositi forum, ciao.
Ma sei un grande! Ti faccio una statua. Sappilo.
Grazie!