Eliminiamo per sempre questo errore
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:wampwwwhead.php:3) in C:wampwwwhead.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.
Fonte: http://razorblade.netsons.org