Cum să remediați eroarea anteturilor deja trimise în PHP

Când îmi rulez scriptul, primesc mai multe erori de genul acesta:

Avertisment: nu se pot modifica informațiile antetului - anteturile deja trimise de (ieșirea a început la /some/file.php:12) în /some/file.php pe linia 23

Rândurile menționate în mesajele de eroare conțin header() și setcookie() apeluri.

Care ar putea fi motivul pentru asta? Și cum să o repar?


person Community    schedule 06.11.2011    source sursă
comment
citiți: stackoverflow.com/questions/1912029/   -  person Book Of Zeus    schedule 06.11.2011
comment
Asigurați-vă că nu este afișat niciun text (ob_start și ob_end_clean() se pot dovedi utile aici). Apoi puteți seta un cookie sau o sesiune egală cu ob_get_contents() și apoi să utilizați ob_end_clean() pentru a șterge tamponul.   -  person Jack    schedule 04.04.2014
comment
Utilizați funcția safeRedirect din biblioteca mea PHP: github.com/heinkasner/PHP -Library/blob/master/extra.php   -  person heinkasner    schedule 24.07.2014
comment
~~~~~~~~~~ Codificarea fișierului dvs. nu ar trebui să fie UTF-8, ci UTF-8 (Without BOM)~~~~~~~~~~~   -  person T.Todua    schedule 19.09.2014


Răspunsuri (11)


Nicio ieșire înainte de a trimite anteturi!

Funcțiile care trimit/modifică anteturile HTTP trebuie să fie invocate înainte de a se realiza orice ieșire. rezumat ⇊ În caz contrar, apelul eșuează:

Avertisment: Nu se pot modifica informațiile antetului - anteturile deja trimise (ieșirea a început la script:line)

Unele funcții care modifică antetul HTTP sunt:

Ieșirea poate fi:

  • Intenționat:

    • print, echo and other functions producing output
    • Secțiuni brute <html> înainte de codul <?php.

De ce se întâmplă?

Pentru a înțelege de ce anteturile trebuie trimise înainte de a ieși, este necesar să priviți un răspuns tipic HTTP. Scripturile PHP generează în principal conținut HTML, dar transmit și un set de anteturi HTTP/CGI către serverul web:

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

<html><head><title>PHP page output page</title></head>
<body><h1>Content</h1> <p>Some more output follows...</p>
and <a href="/"> <img src=internal-icon-delayed> </a>

Pagina/ieșirea urmează întotdeauna anteturile. PHP trebuie să treacă mai întâi anteturile către serverul web. Poate face asta o singură dată. După dubla întrerupere de linie, nu le mai poate modifica niciodată.

Când PHP primește prima ieșire (print, echo, <html>) va șterge toate anteturile colectate. După aceea, poate trimite toate rezultatele dorite. Dar trimiterea de anteturi HTTP suplimentare este imposibilă atunci.

Cum puteți afla unde a avut loc ieșirea prematură?

Avertismentul header() conține toate informațiile relevante pentru a localiza cauza problemei:

Avertisment: Nu se pot modifica informațiile din antet - anteturile deja trimise de (ieșirea a început la /www/usr2345/htdocs/auth.php:52) în /www/usr2345/htdocs/index.php pe linia 100

Aici linia 100 se referă la scriptul în care header() invocarea a eșuat.

ieșirea începută la nota din paranteză este mai semnificativă. Denumește sursa ieșirii anterioare. În acest exemplu, este auth.php și linia 52. Acolo trebuia să cauți rezultate premature.

Cauzele tipice:

  1. Imprimare, ecou

    Ieșirea intenționată din instrucțiunile print și echo va pune capăt oportunității de a trimite anteturi HTTP. Fluxul de aplicare trebuie restructurat pentru a evita acest lucru. Folosiți funcții și scheme de șabloane. Asigurați-vă că header() apelurile au loc înainte de să fie scrise mesajele.

    Funcțiile care produc rezultate includ

    • print, echo, printf, vprintf
    • trigger_error, ob_flush, ob_end_flush, var_dump, print_r
    • readfile, passthru, flush, imagepng, imagejpeg


    printre altele și funcții definite de utilizator.

  2. Zone HTML brute

    Secțiunile HTML neanalizate dintr-un fișier .php sunt, de asemenea, rezultate directe. Condițiile de script care vor declanșa un apel header() trebuie notate înainte de orice blocuri brute <html>.

    <!DOCTYPE html>
    <?php
        // Too late for headers already.
    

    Utilizați o schemă de șablon pentru a separa procesarea de logica de ieșire.

    • Place form processing code atop scripts.
    • Utilizați variabile șir temporare pentru a amâna mesajele.
    • Logica reală de ieșire și ieșirea HTML amestecată ar trebui să urmeze ultima.

  3. Spațiu înainte de <?php pentru avertismentele script.php linia 1

    Dacă avertismentul se referă la ieșirea în linie 1, atunci este în mare parte spații albe, text sau HTML înainte de simbolul <?php de deschidere.

     <?php
    # There's a SINGLE space/newline before <? - Which already seals it.
    

    În mod similar, poate apărea și pentru scripturile atașate sau secțiunile de script:

    ?>
    
    <?php
    

    PHP consumă de fapt o singura întrerupere de linie după etichetele apropiate. Dar nu va compensa mai multe linii noi sau file sau spații mutate în astfel de goluri.

  4. #P64# #P23# #P24# editor Joes afișând BOM UTF-8  substituent și editor MC un punct #P25# beav hexeditor care arată utf  -8 bom #P26# #P65# #P27#
    phptags  --whitespace  *.php
    
    #P28#
  5. Spații albe după ?>

    Dacă sursa de eroare este menționată ca în spatele închiderea ?>, atunci aici au apărut niște spații albe sau textul brut scrise. Marcatorul de sfârșit PHP nu oprește execuția scriptului în acest moment. Orice caractere de text/spațiu după acesta vor fi scrise în continuare ca conținut de pagină.

    În mod obișnuit, se recomandă, în special noilor veniți, ca etichetele de închidere ?> PHP să fie omise. Acest lucru evită o mică parte din aceste cazuri. (Destul de frecvent, scripturile include()d sunt vinovate.)

  6. Sursa de eroare menționată ca Necunoscută pe linia 0

    Este de obicei o extensie PHP sau o setare php.ini dacă nu se concretizează nicio sursă de eroare.

    • It's occasionally the gzip stream encoding setting or the ob_gzhandler.
    • Dar ar putea fi și orice modul extension= încărcat dublu care generează un mesaj implicit de pornire/avertizare PHP.

  7. Mesajele de eroare precedente

    Dacă o altă instrucțiune sau expresie PHP determină tipărirea unui mesaj de avertizare sau a unei notificări, aceasta contează și ca rezultat prematur.

    În acest caz, trebuie să evitați eroarea, să întârziați execuția instrucțiunii sau să suprimați mesajul cu, de ex. isset() sau @()< /a> - când nici unul nu împiedică depanarea mai târziu.

Niciun mesaj de eroare

Dacă aveți error_reporting sau display_errors dezactivat pentru php.ini, atunci nu va apărea niciun avertisment. Dar ignorarea erorilor nu va face problema să dispară. Anteturile încă nu pot fi trimise după o ieșire prematură.

Deci, atunci când redirecționările header("Location: ...") eșuează în tăcere, este foarte recomandabil să cercetați avertismente. Reactivați-le cu două comenzi simple deasupra scriptului de invocare:

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

Sau set_error_handler("var_dump"); dacă toate celelalte nu reușesc.

Vorbind despre anteturile de redirecționare, ar trebui să folosiți adesea un limbaj ca acesta pentru căile finale ale codului:

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

De preferință chiar și o funcție de utilitate, care imprimă un mesaj de utilizator în cazul erorilor header().

Buffering de ieșire ca o soluție

PHP-ul buffering de ieșire este o soluție pentru a atenua această problemă. Adesea funcționează fiabil, dar nu ar trebui să înlocuiască structurarea adecvată a aplicației și separarea ieșirii de logica de control. Scopul său real este de a minimiza transferurile în bucăți către serverul web.

  1. Cu toate acestea, setarea output_buffering= poate ajuta. Configurați-l în php.ini sau prin .htaccess sau chiar .user.ini pe setările moderne FPM/FastCGI.
    Activarea acestuia va permite PHP să tamponeze ieșirea în loc să o transmită serverului web imediat. PHP poate astfel agrega anteturi HTTP.

  2. De asemenea, poate fi angajat cu un apel către ob_start(); deasupra scriptului de invocare. Care, totuși, este mai puțin de încredere din mai multe motive:

    • Chiar dacă <?php ob_start(); ?> pornește primul script, spațiile albe sau o BOM ar putea fi amestecate înainte, făcându-l ineficient.

    • Poate ascunde spații albe pentru ieșirea HTML. Dar de îndată ce logica aplicației încearcă să trimită conținut binar (o imagine generată de exemplu), ieșirea străină tamponată devine o problemă. (Necesită ob_clean() ca o soluție suplimentară.)

    • Buffer-ul este limitat în dimensiune și poate depăși cu ușurință atunci când este lăsat la valorile implicite. Și nici asta nu este o întâmplare rară, dificil de urmărit când se întâmplă.

Prin urmare, ambele abordări pot deveni nesigure - în special atunci când comutați între setările de dezvoltare și/sau serverele de producție. Acesta este motivul pentru care tamponarea de ieșire este considerată în general doar o cârjă / strict o soluție.

Consultați și exemplul de utilizare de bază din manual și pentru mai multe argumente pro şi contra:

Dar a funcționat pe celălalt server!?

Dacă nu ați primit avertismentul de antet înainte, atunci setarea php.ini de buffering de ieșire s-a schimbat. Este probabil neconfigurat pe serverul actual/nou.

Se verifică cu headers_sent()

Puteți utiliza oricând headers_sent() pentru a verifica dacă mai este posibil să... trimiteți anteturi. Ceea ce este util pentru a imprima condiționat informații sau pentru a aplica altă logică de rezervă.

if (headers_sent()) {
    die("Redirect failed. Please click on this link: <a href=...>");
}
else{
    exit(header("Location: /user.php"));
}

Soluțiile alternative utile sunt:

  • Etichetă HTML <meta>

    Dacă aplicația dvs. este greu de remediat din punct de vedere structural, atunci o modalitate ușoară (dar oarecum neprofesională) de a permite redirecționări este injectarea unei etichete HTML <meta>. O redirecționare poate fi realizată cu:

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

    Sau cu o scurtă întârziere:

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

    Acest lucru duce la HTML nevalid atunci când este utilizat după secțiunea <head>. Majoritatea browserelor încă îl acceptă.

  • redirecționare JavaScript

    Ca alternativă, poate fi utilizată o redirecționare JavaScript pentru redirecționări de pagină:

     <script> location.replace("target.html"); </script>
    

    Deși aceasta este adesea mai compatibilă cu HTML decât soluția <meta>, aceasta implică o dependență de clienți capabili de JavaScript.

Ambele abordări fac totuși alternative acceptabile atunci când apelurile autentice HTTP header() eșuează. În mod ideal, ați combina întotdeauna acest lucru cu un mesaj ușor de utilizat și un link pe care se poate face clic ca ultimă soluție. (Ceea ce, de exemplu, este ceea ce face extensia PECL http://php.net/http_redirect.)

De ce sunt afectate și setcookie() și session_start()

Atât setcookie(), cât și session_start() trebuie să trimită un antet HTTP Set-Cookie:. Prin urmare, se aplică aceleași condiții și vor fi generate mesaje de eroare similare pentru situații de ieșire prematură.

(Desigur, acestea sunt în plus afectate de cookie-urile dezactivate în browser sau chiar de problemele proxy. Funcționalitatea sesiunii depinde, evident, și de spațiul liber pe disc și alte setări php.ini etc.)

Link-uri suplimentare

person mario    schedule 06.11.2011
comment
De asemenea, notepad.exe obișnuit este dificil. Eu folosesc NetBeans în mod normal care nu adaugă BOM, chiar dacă fișierul este codificat așa. Editarea mai târziu a unui fișier în bloc-notes încurcă lucrurile, în special față de IIS ca server web. Se pare că apache renunță la BOM (adăugat neintenționat). - person Teson; 03.12.2015
comment
Eliminarea ?> de închidere de la sfârșitul unui fișier php este de obicei o practică bună care ajută și la minimizarea acestor erori. Spațiile albe nedorite nu vor apărea la sfârșitul fișierelor și veți putea în continuare să adăugați anteturi la răspuns mai târziu. Este, de asemenea, util dacă utilizați buffering de ieșire și nu doriți să vedeți spațiu alb nedorit adăugat la sfârșitul părților generate de fișierele incluse. - person Nikita 웃; 08.02.2016
comment
Lucru ciudat, mi-am mutat fișierul de la cPanel Linux Hosting la VPS. Înainte de a funcționa corect, dar aici a arătat această eroare. (Aveam ceva cod html înainte de antet). De ce? - person Pablo Escobar; 30.04.2017
comment
@Purushotamrawat Ai citit partea despre Dar a funcționat pe celălalt server!? - person mario; 30.04.2017
comment
@mario, dar nu am schimbat Buffer-ul de ieșire - person Pablo Escobar; 30.04.2017
comment
@TheCrazyProfessor, deoarece așteaptă înainte de a trimite ceva către client până când rezultatul complet este redat/bufferizat pe partea serverului. Fără buffering de ieșire, serverul începe să trimită datele pe măsură ce sunt generate (streaming), caz în care trebuie să trimită mai întâi anteturi care nu pot fi manipulate mai târziu. - person huysentruitw; 16.05.2017
comment
și uneori este vorba doar despre versiunea php! Este atât de dificil să editezi toate codurile complicate și este mai bine să schimbi versiunea php a serverului la cea mai compatibilă cu codurile tale - person Solivan; 12.07.2017
comment
Când pagina se încarcă, am deja un antet Content-Type: încărcat și trimis. Ce setare a făcut să se întâmple asta? - person Peter S McIntyre; 01.08.2017
comment
@PeterSMcIntyre BOM-ul UTF8 probabil (remediază asta) / nu este activată nicio memorie tampon de ieșire (nu te baza pe asta). - person mario; 02.08.2017
comment
Vreau doar să menționez că utilizarea curl și nu setarea CURLOPT_RETURNTRANSFER la TRUE poate produce, de asemenea, ieșire și, prin urmare, poate declanșa eroarea „antete deja trimise” - person kask; 19.03.2018
comment
Vă mulțumim că ați adăugat cauzele neintenționate la început. Aveam un spațiu mic, mic înainte de o etichetă <?php într-unul dintre fișierele incluse. - person AnalogWeapon; 20.05.2018
comment
Dacă într-adevăr trebuie să afișați conținut înainte de a redirecționa. Puteți utiliza înlocuirea în JavaScript: window.location.replace(newUrl.com);. Puteți configura o funcție JS recursivă cu setTimeout() care caută informații pe pagină care semnalează că este timpul să redirecționați și apoi apelează înlocuire. - person Bob Ray; 05.06.2018
comment
Pentru Dar a funcționat pe celălalt server!? parte -- a fost cazul meu, în cazul în care rulați propriul server local, încercați să editați fișierul php.ini și setați output_buffering la output_buffering=4096. DACĂ ACEST NU FUNCȚIONEAZĂ - încercați să o măriți. Asta a fost problema mea. A trebuit să măresc tamponul la 64 kb pentru că unele pagini erau atât de mari. Ah și, de asemenea, nu uitați să reporniți serverul, pentru orice eventualitate. - person hocikto; 24.06.2018
comment
Dacă utilizați UltraEdit, Salvați ca (Selectați opțiunea de codare jos din dreapta) UTF-8 Fără boM (acesta a rezolvat-o pentru mine) - person hamish; 14.07.2019
comment
Nimic nu a funcționat pentru mine, cu excepția faptului că ob_start(); a rezolvat problema. Mulțumiri - person Jodyshop; 16.08.2019
comment
Spații albe înainte de ‹?php pentru avertismentele din linia 1 script.php au funcționat pentru mine. Mulțumesc pentru această explicație minunată - person Immran Mohammed; 16.03.2020
comment
Răspuns frumos bine elaborat. - person Hillel; 19.04.2021
comment
Doar un detaliu ratat pe care poate doriți să îl adăugați. $file = $line = null; headers_sent($file, $line); die("$file:$line"); vă va spune exact ce a trimis anteturile, dacă mesajul de eroare omite aceste informații. Nu știu sigur de ce, dar uneori așa pare să fie. - person kmuenkel; 16.06.2021

Acest mesaj de eroare este declanșat atunci când orice este trimis înainte de a trimite anteturi HTTP (cu setcookie sau header). Motivele obișnuite pentru a afișa ceva înainte de anteturile HTTP sunt:

  • Spații albe accidentale, adesea la începutul sau la sfârșitul fișierelor, astfel:

     <?php
    // Note the space before "<?php"
    ?>
    

Pentru a evita acest lucru, pur și simplu omiteți ?> de închidere - oricum nu este obligatoriu.

  • Marcă de ordine a octetilor la începutul unui fișier php. Examinați fișierele dvs. php cu un editor hex pentru a afla dacă acesta este cazul. Ar trebui să înceapă cu octeții 3F 3C. Puteți elimina în siguranță BOM EF BB BF de la începutul fișierelor.
  • Ieșire explicită, cum ar fi apeluri către echo, printf, readfile, passthru, cod înainte de <? etc.
  • Un avertisment trimis de php, dacă proprietatea display_errors php.ini este setată. În loc să se blocheze din cauza unei greșeli a programatorului, php remediază în tăcere eroarea și emite un avertisment. În timp ce puteți modifica display_errors sau error_reporting, ar trebui mai degrabă să remediați problema.
    Motivele frecvente sunt accesul la elemente nedefinite ale unei matrice (cum ar fi $_POST['input'] fără a utiliza empty sau isset pentru a testa dacă intrarea este set), sau folosind o constantă nedefinită în loc de un literal șir (ca în $_POST[input], rețineți ghilimelele lipsă).

Activarea buffering de ieșire ar trebui să facă problema să dispară; toate ieșirile după apelul la ob_start sunt stocate în memorie până când eliberați memoria tampon, de ex. cu ob_end_flush.

Cu toate acestea, deși tamponarea de ieșire evită problemele, ar trebui să determinați cu adevărat de ce aplicația dvs. scoate un corp HTTP înaintea antetului HTTP. Ar fi ca și cum ai lua un telefon și ai discuta despre ziua ta și despre vreme înainte de a-i spune apelantului că a greșit numărul.

person phihag    schedule 06.11.2011

În loc de linia de mai jos

//header("Location:".ADMIN_URL."/index.php");

scrie

echo("<script>location.href = '".ADMIN_URL."/index.php?msg=$msg';</script>");

or

?><script><?php echo("location.href = '".ADMIN_URL."/index.php?msg=$msg';");?></script><?php

Cu siguranță îți va rezolva problema. M-am confruntat cu aceeași problemă, dar am rezolvat-o prin scrierea locației antetului în modul de mai sus.

person Ipsita Rout    schedule 24.03.2013

Tu faci

printf ("Hi %s,</br />", $name);

înainte de a seta cookie-urile, ceea ce nu este permis. Nu puteți trimite nicio ieșire înaintea antetelor, nici măcar o linie goală.

person Seth Carnegie    schedule 06.11.2011

PROBLEME COMUNE:

(copiat din: sursă)

====================

1) nu ar trebui să existe nicio ieșire (adică echo.. sau coduri HTML) înaintea comenzii header(.......);.

2) elimina orice spațiu alb(sau linie nouă) înainte de <?php și după ?> etichete.

3) GOLDEN RULE! - verificați dacă acel fișier php (și, de asemenea, dacă aveți include alte fișiere) are UTF8 fără codificare BOM (și nu doar UTF-8). Aceasta este o problemă în multe cazuri (deoarece fișierul codificat UTF8 are ceva caracter special la începutul fișierului php, pe care editorul dvs. de text nu îl arată)!!!!!!!!!!!

4) După header(...); trebuie să utilizați exit;

5) folosiți întotdeauna referința 301 sau 302:

header("location: http://example.com",  true,  301 );  exit;

6) Activați raportarea erorilor și găsiți eroarea. Eroarea dvs. poate fi cauzată de o funcție care nu funcționează. Când activați raportarea erorilor, ar trebui să remediați întotdeauna prima eroare. De exemplu, ar putea fi „Avertisment: date_default_timezone_get(): Nu este sigur să vă bazați pe setările sistemului de fus orar”. - apoi, mai jos, este posibil să vedeți eroarea „anteturilor nu au fost trimise”. După ce ați remediat cea mai mare eroare (prima), reîncărcați pagina. Dacă mai aveți erori, remediați din nou cea mai mare eroare.

7) Dacă niciuna dintre cele de mai sus nu ajută, utilizați redirecționarea JAVSCRIPT (cu toate acestea, metoda nerecomandată cu fermitate), poate fi ultima șansă în cazuri personalizate...:

echo "<script type='text/javascript'>window.top.location='http://website.com/';</script>"; exit;
person Community    schedule 09.04.2015
comment
De ce este importantă setarea explicit a 301 sau 302? - person Jānis Elmeris; 15.04.2019
comment
Puteți avea ieșire dacă output_buffering din fișierul php.ini este setat. Al meu de pe sistemul meu Debian de acasă este setat la 4096. Cel de pe serverul pe care îl folosesc afirmă că nu are nicio setare. - person Programming Padawan; 09.07.2020

Din cauza acestei linii:

printf ("Hi %s,</br />", $name);

Nu trebuie să printați/ecou nimic înainte de a trimite anteturile.

person Sarfraz    schedule 06.11.2011

Un sfat simplu: un spațiu simplu (sau un caracter special invizibil) în scriptul dvs., chiar înainte de prima etichetă <?php, poate provoca acest lucru! Mai ales când lucrezi într-o echipă și cineva folosește un IDE „slab” sau s-a încurcat în fișiere cu editoare de text ciudate.

am vazut aceste lucruri ;)

person Sliq    schedule 16.05.2012

O altă practică proastă poate invoca această problemă care nu este încă declarată.

Vedeți acest fragment de cod:

<?php
include('a_important_file.php'); //really really really bad practise
header("Location:A location");
?>

Lucrurile sunt în regulă, nu?

Ce se întâmplă dacă „a_important_file.php” este acesta:

<?php
//some php code 
//another line of php code
//no line above is generating any output
?>

 ----------This is the end of the an_important_file-------------------

Acest lucru nu va funcționa? De ce? Pentru că deja este generată o nouă linie.

Acum, deși acesta nu este un scenariu obișnuit, ce se întâmplă dacă utilizați un cadru MVC care încarcă o mulțime de fișiere înainte de a preda lucrurile controlerului dvs.? Acesta nu este un scenariu neobișnuit. Fiți pregătiți pentru asta.

Din PSR-2 2.2 :


  • Toate fișierele PHP TREBUIE să folosească Unix LF (linefeed) line ending.
  • Toate fișierele PHP TREBUIE să se termine cu single blank line.
  • Eticheta de închidere ?> TREBUIE să fie omitted din fișierele care conțin only php

Crede-mă, respectarea acestor standarde te poate scuti de o mulțime de ore din viața ta :)

person MD. Sahib Bin Mahboob    schedule 08.11.2013
comment
Conform mai multor standarde (Zend de exemplu), nu ar trebui să puneți în niciun caz eticheta de închidere ?> în niciun fișier. - person Daniel W.; 04.04.2014
comment
Nu pot reproduce acest lucru în mediul Windows, deoarece funcționează folosind orice combinație (adăugând etichete de închidere, spații libere, apăsând tasta Enter etc.). Se pare că această problemă se întâmplă mai ales în mediile Linux. - person Junior Mayhé; 10.06.2015
comment
@JuniorM Ar trebui să fie reproductibil. Poți împărtăși codul pe care l-ai experimentat într-un principiu sau ceva asemănător? - person MD. Sahib Bin Mahboob; 11.06.2015
comment
Sunt pe Windows 7, cu cel mai recent Wamp instalat. Cred că această eroare este legată de caracterele ascunse pentru sfârșitul rândului. Shortcodes.php din Wordpress-ul meu a fost cauza problemei. Am adăugat la acest fișier o funcție simplă și a început să declanșeze această eroare trimisă de anteturi. Mi-am comparat shortcodes.php cu wordpress' și a fost ok, cu excepția CR LF (sfârșitul liniei tipic Windows). O rezolv descărcând fișierul original din Wordpress repo care are LF (Linux final of line) în loc de CR LF și mi-am mutat și funcția în funcțiile.php ale temei. Bazat pe: bit.ly/1Gh6mzN - person Junior Mayhé; 11.06.2015
comment
@Sahib, observați că încă nu pot reproduce ceea ce este declarat în acest răspuns. Răspunsul este perfect pentru mediul Linux. Am testat lucruri ca un gol între ?> <?php, eliminând și adăugând o singură linie goală, adăugat și omis eticheta de închidere ?>. În Windows+ Wamp toate aceste combinații funcționează bine. ciudat... - person Junior Mayhé; 11.06.2015
comment
:+1: Am avut aceeași problemă, dar invers: fișierul important pe care l-am inclus avea comanda header() în el și scriptul principal (care avea un nume foarte asemănător) producea rezultate înainte de includere. - person rubo77; 26.03.2021

Uneori, când procesul de dev are atât stații de lucru WIN, cât și sisteme LINUX (găzduire) și în cod nu vedeți nicio ieșire înainte de linia aferentă, ar putea fi formatarea fișierului și lipsa Unix LF (linefeed) ) sfârșit de linie.

Ceea ce facem de obicei pentru a remedia rapid acest lucru, este să redenumim fișierul și pe sistemul LINUX să creăm un fișier nou în loc de cel redenumit, apoi să copiați conținutul în acesta. De multe ori, aceasta rezolvă problema, deoarece unele dintre fișierele care au fost create în WIN odată mutate în găzduire cauzează această problemă.

Această remediere este o remediere ușoară pentru site-urile pe care le gestionăm prin FTP și, uneori, poate salva noii membri ai echipei.

person Community    schedule 21.05.2015

În general, această eroare apare atunci când trimitem antetul după ecou sau imprimare. Dacă această eroare apare pe o anumită pagină, asigurați-vă că acea pagină nu emite nimic înainte de a apela la start_session().

Exemplu de eroare imprevizibilă:

 <?php //a white-space before <?php also send for output and arise error
session_start();
session_regenerate_id();

//your page content

Inca un exemplu:

<?php
includes 'functions.php';
?> <!-- This new line will also arise error -->
<?php
session_start();
session_regenerate_id();

//your page content

Concluzie: nu scoateți niciun caracter înainte de a apela funcțiile session_start() sau header() nici măcar un spațiu alb sau o linie nouă

person Community    schedule 03.02.2015

person    schedule
comment
ob_start() doar ascunde problema; nu-l utilizați pentru a rezolva această problemă specială. - person Ja͢ck; 15.05.2013
comment
@Ja͢ck Dacă nu folosesc ob_start(), atunci ce ar trebui să fac pentru a rezolva această problemă: Headers already sent - person Shafizadeh; 14.07.2015
comment
@Sajad dacă primești eroarea în mod special din cauza editorului pe care îl folosești, ar trebui să te joci cu setările pentru ca aceasta să nu mai cauzeze problema sau să schimbi editorul. Dacă primiți eroarea din orice alt motiv, ar trebui să citiți răspunsurile la această întrebare (în special răspunsul acceptat) pentru a vă da seama care este de fapt problema și pentru a o rezolva. - person Samsquanch; 14.07.2015
comment
ob_start() nu ascunde problema, ci rezolvă problema. - person Tomas; 22.10.2015
comment
Am avut o astfel de problemă când îmi încarc fișierele pe server, care accepta chiar și PHP5.3 Utilizați server cu PHP 5.6 sau mai mult - person GGSoft; 09.12.2015
comment
@jack adevărat, sunt de acord cu tine. Modul ideal este să eliminați spațiile înainte de a începe eticheta php <? - person Manish Shrivastava; 06.05.2017
comment
Mulți oameni întreabă unde să adauge ob_start();. pentru că după adăugarea ob_start(); încă primesc eroarea. Trebuie să adăugați la pagina care a declanșat pagina curentă. Ex: pagina 1 (apăsat butonul) -› pagina 2. (redirecționare antet) -› pagina 0 (acasă). Trebuie să-l adăugați la pagina1. Mulți oameni s-au încurcat și adaugă în pagina 2. - person Dexter; 07.08.2018
comment
Mi-am rezolvat problema. - person NickDimou; 26.01.2021