Jak naprawić błąd „Nagłówki już wysłane” w PHP

831

Podczas uruchamiania skryptu pojawia się kilka takich błędów:

Ostrzeżenie: Nie można modyfikować informacji nagłówka - nagłówki już wysłane przez ( wyjście rozpoczęto w /some/file.php:12 ) w /some/file.php w linii 23

Wiersze wymienione w komunikatach o błędach zawierają header()i setcookie()wywołania.

Co mogłoby być tego przyczyną? I jak to naprawić?

Mojżesz89
źródło
Upewnij się, że żaden tekst nie jest generowany ( ob_starti ob_end_clean() może okazać się przydatny tutaj). Następnie możesz ustawić ciasteczko lub sesję równe, ob_get_contents()a następnie użyć ob_end_clean()do wyczyszczenia bufora.
Jack Tuck
Użyj safeRedirectfunkcji w mojej bibliotece PHP: github.com/heinkasner/PHP-Library/blob/master/extra.php
heinkasner
5
~~~~~~~~~~ Twój plik KODOWANIE nie powinien być UTF-8, ale UTF-8 (Without BOM)~~~~~~~~~~~
T.Todua

Odpowiedzi:

2995

Brak danych wyjściowych przed wysłaniem nagłówków!

Funkcje wysyłające / modyfikujące nagłówki HTTP muszą być wywoływane przed wykonaniem jakiegokolwiek wyniku . summary ⇊ W przeciwnym razie połączenie nie powiedzie się:

Ostrzeżenie: Nie można modyfikować informacji nagłówka - nagłówki już wysłane (wyjście rozpoczęte w skrypcie: wiersz )

Niektóre funkcje modyfikujące nagłówek HTTP to:

Dane wyjściowe mogą być:

  • Nieumyślny:

    • Biała spacja przed <?phplub po?>
    • UTF-8 Byte Order Mark specjalnie
    • Poprzednie komunikaty o błędach lub powiadomienia
  • Zamierzony:

    • print, echoOraz inne funkcje wyświetlania produkcji
    • Surowe <html>odcinki przed <?phpkodu.

Dlaczego tak się dzieje?

Aby zrozumieć, dlaczego nagłówki muszą być wysyłane przed wyjściem, należy spojrzeć na typową odpowiedź HTTP . Skrypty PHP generują głównie treść HTML, ale także przekazują zestaw nagłówków HTTP / CGI do serwera:

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>

Strona / wyjście zawsze następuje po nagłówkach. PHP musi najpierw przekazać nagłówki do serwera WWW. Może to zrobić tylko raz. Po podwójnym podziale wiersza nie można ich już zmienić.

Gdy PHP odbiera pierwsze wyjście ( print, echo, <html>) będzie opróżnić wszystkich zebranych nagłówków. Następnie może wysłać wszystkie potrzebne dane wyjściowe. Ale wysyłanie kolejnych nagłówków HTTP jest wówczas niemożliwe.

Jak dowiedzieć się, gdzie wystąpiło przedwczesne wyjście?

header()Ostrzeżenie zawiera wszystkie istotne informacje, aby znaleźć przyczynę problemu:

Ostrzeżenie: Nie można modyfikować informacji nagłówka - nagłówki zostały już wysłane przez (wyjście rozpoczęto w / www / usr2345 / htdocs / auth.php: 52 ) w /www/usr2345/htdocs/index.php w linii 100

Tutaj „wiersz 100” odnosi się do skryptu, w którym header() wywołanie nie powiodło się.

Uwaga „ wyjście rozpoczęte o ” w nawiasie jest bardziej znacząca. Określa źródło poprzedniej produkcji. W tym przykładzie jest to auth.php i linia52 . Właśnie tam trzeba było szukać przedwczesnych wyników.

Typowe przyczyny:

  1. Drukuj, echo

    Umyślne wyjście printi echoinstrukcje zakończą możliwość wysyłania nagłówków HTTP. Aby tego uniknąć, przepływ aplikacji musi zostać zrestrukturyzowany. Użyj funkcji i schematów szablonów. Upewnij się, że header()połączenia są wykonywane przed wypisaniem wiadomości.

    Funkcje generujące dane wyjściowe obejmują

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


    między innymi funkcje zdefiniowane przez użytkownika.

  2. Surowe obszary HTML

    Nieprzetworzone sekcje HTML w .phppliku są również wyprowadzane bezpośrednio. Warunki skrypt, który wywoła header()połączenie należy zaznaczyć przed wszelkimi surowych <html>bloków.

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

    Użyj schematu szablonów, aby oddzielić przetwarzanie od logiki wyjściowej.

    • Umieść kod przetwarzania formularza na skryptach.
    • Użyj tymczasowych zmiennych łańcuchowych, aby odroczyć komunikaty.
    • Rzeczywista logika wyjściowa i zmieszane wyjście HTML powinny następować na końcu.

  3. Wcześniej <?phpspacje dla ostrzeżeń „skrypt.php wiersz 1

    Jeśli ostrzeżenie odnosi się do danych wyjściowych w linii 1, oznacza to przede wszystkim białe znaki , tekst lub HTML przed <?phptokenem otwierającym .

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

    Podobnie może się zdarzyć w przypadku dołączonych skryptów lub sekcji skryptów:

    ?>
    
    <?php
    

    PHP zjada pojedynczy podział wiersza po zamknięciu tagów. Ale to nie zrekompensuje wielu nowych linii, tabulatorów lub spacji przesuniętych w takie luki.

  4. LM UTF-8

    Problemem mogą być same łamanie linii i spacje. Ale są też „niewidzialne” sekwencje znaków, które mogą to powodować. Najbardziej znany BOM UTF-8 (Bajt-Znak-Znak), który nie jest wyświetlany przez większość edytorów tekstu. Jest to sekwencja bajtów EF BB BF, która jest opcjonalna i nadmiarowa dla dokumentów zakodowanych w UTF-8. PHP musi jednak traktować to jako surowe wyjście. Może pojawiać się jako znaki na wyjściu (jeśli klient interpretuje dokument jako Latin-1) lub podobne „śmieci”.

    W szczególności edytory graficzne i środowiska IDE oparte na Javie są nieświadome jego obecności. Nie wizualizują go (zgodnie ze standardem Unicode). Jednak większość programistów i edytorów konsolowych:

    edytor joes pokazujący symbol zastępczy BOM UTF-8, a edytor MC kropkę

    Łatwo jest wcześnie rozpoznać problem. Inni redaktorzy mogą zidentyfikować jego obecność w menu pliku / ustawień (Notepad ++ w systemie Windows może zidentyfikować i rozwiązać problem ). Inną opcją sprawdzenia obecności BOM jest uciekanie się do hekseditora . W systemach * nix hexdumpjest zwykle dostępna wersja graficzna, która upraszcza kontrolę tych i innych problemów:

    beav hexeditor pokazano utf-8 bom

    Łatwym rozwiązaniem jest ustawienie edytora tekstu do zapisywania plików jako „UTF-8 (bez BOM)” lub podobnej nomenklatury. Często nowi użytkownicy uciekają się do tworzenia nowych plików i kopiowania i wklejania poprzedniego kodu.

    Narzędzia korekcyjne

    Istnieją również zautomatyzowane narzędzia do sprawdzania i przepisywania plików tekstowych ( sed/awk lub recode). W przypadku PHP istnieje phptagstag tidier . Przeredagowuje zamykanie i otwieranie znaczników w długie i krótkie formy, ale z łatwością rozwiązuje także wiodące i końcowe problemy z białymi znakami, Unicode i UTF-x BOM:

    phptags  --whitespace  *.php

    Używanie całego katalogu włączeń lub projektów jest rozsądne.

  5. Biała spacja po ?>

    Jeśli źródło błędu jest wspomniane jako za zamknięciem,?> to tutaj zapisano trochę białych znaków lub nieprzetworzonego tekstu. Znacznik końca PHP nie kończy w tym momencie wykonywania skryptu. Wszelkie znaki tekstu / spacji po nim zostaną zapisane jako treść strony.

    Powszechnie zaleca się, szczególnie początkującym, że końcowe ?>znaczniki zamykające PHP powinny zostać pominięte. Pozwala to uniknąć niewielkiej części tych przypadków. (Dość często include()dsprawcami są skrypty).

  6. Źródło błędu wymienione jako „Nieznany w linii 0”

    Zazwyczaj jest to rozszerzenie PHP lub php.ini, jeśli żadne źródło błędu nie jest konkretyzowane.

    • Czasami jest to gzipustawienie kodowania strumienia lubob_gzhandler .
    • Ale może to być również extension=moduł podwójnie załadowany generujący domyślny komunikat startowy / ostrzegawczy PHP.

  7. Poprzednie komunikaty o błędach

    Jeśli inna instrukcja lub wyrażenie PHP powoduje wydrukowanie komunikatu ostrzegawczego lub powiadomienia, jest to również liczone jako przedwczesne wyjście.

    W takim przypadku musisz uniknąć błędu, opóźnić wykonanie instrukcji lub ukryć komunikat za pomocą np. isset()Lub @()- gdy albo nie utrudni to późniejszego debugowania.

Brak komunikatu o błędzie

Jeśli masz error_reportinglub display_errorswyłączyłeś php.ini, nie pojawi się żadne ostrzeżenie. Ale ignorowanie błędów nie spowoduje, że problem zniknie. Nagłówków nadal nie można wysłać po przedwczesnym wyjściu.

Dlatego gdy header("Location: ...")przekierowania po cichu nie działają, wskazane jest sprawdzenie ostrzeżeń. Ponownie włącz je za pomocą dwóch prostych poleceń na skrypcie wywołania:

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

Lub set_error_handler("var_dump");jeśli wszystko inne zawiedzie.

Mówiąc o nagłówkach przekierowań, powinieneś często używać takiego idiomu dla końcowych ścieżek kodu:

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

Najlepiej nawet funkcja użyteczna, która drukuje komunikat użytkownika w przypadku header()awarii.

Buforowanie danych wyjściowych jako obejście

Buforowanie danych wyjściowych PHPs jest obejściem tego problemu. Często działa niezawodnie, ale nie powinno zastępować właściwej struktury aplikacji i oddzielania danych wyjściowych od logiki sterowania. Jego rzeczywistym celem jest zminimalizowanie porcji przesyłanych na serwer internetowy.

  1. output_buffering= Ustawienie mimo to może pomóc. Skonfiguruj go w php.ini lub poprzez .htaccess, a nawet .user.ini w nowoczesnych konfiguracjach FPM / FastCGI.
    Włączenie go pozwoli PHP buforować dane wyjściowe zamiast natychmiastowego przekazywania ich do serwera WWW. PHP może zatem agregować nagłówki HTTP.

  2. Może być również zaangażowany w wywołanie na ob_start(); szczycie skryptu wywołania. Który jednak jest mniej niezawodny z wielu powodów:

    • Nawet jeśli <?php ob_start(); ?>uruchamia się pierwszy skrypt, białe znaki lub LM mogą być wcześniej tasowane, co czyni go nieskutecznym .

    • Może ukrywać białe znaki dla danych wyjściowych HTML. Ale gdy tylko logika aplikacji próbuje wysłać zawartość binarną (na przykład wygenerowany obraz), buforowane zbędne dane wyjściowe stają się problemem. (Konieczne ob_clean() jako dalsze obejście).

    • Bufor ma ograniczony rozmiar i może łatwo zostać przekroczony, gdy zostanie pozostawiony domyślny. I nie jest to również rzadkie zjawisko, trudne do wyśledzenia, kiedy to się dzieje.

Oba podejścia mogą zatem stać się zawodne - w szczególności przy przełączaniu między konfiguracjami programistycznymi i / lub serwerami produkcyjnymi. Dlatego buforowanie danych wyjściowych jest powszechnie uważane za zwykłe rozwiązanie.

Zobacz także przykład użycia podstawowego w instrukcji oraz dodatkowe zalety i wady:

Ale działało na drugim serwerze !?

Jeśli wcześniej nie otrzymałeś ostrzeżenia w nagłówkach, oznacza to, że ustawienie bufora wyjściowego php.ini uległo zmianie. Prawdopodobnie jest nieskonfigurowany na bieżącym / nowym serwerze.

Sprawdzanie za pomocą headers_sent()

Zawsze możesz użyć headers_sent()do sprawdzenia, czy nadal można ... wysłać nagłówki. Co jest przydatne do warunkowego wydrukowania informacji lub zastosowania innej logiki zastępczej.

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

Przydatne obejścia zastępcze to:

  • <meta>Tag HTML

    Jeśli aplikacja jest strukturalnie trudna do naprawienia, to łatwym (ale nieco nieprofesjonalnym) sposobem na umożliwienie przekierowań jest wstrzykiwanie <meta>znacznika HTML . Przekierowanie można osiągnąć za pomocą:

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

    Lub z krótkim opóźnieniem:

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

    Prowadzi to do nieprawidłowego kodu HTML, jeśli zostanie wykorzystany poza <head>sekcją. Większość przeglądarek nadal to akceptuje.

  • Przekierowanie JavaScript

    Alternatywnie do przekierowań stron można użyć przekierowania JavaScript :

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

    Chociaż jest to często bardziej zgodne z HTML niż <meta>obejście, powoduje to poleganie na klientach obsługujących JavaScript.

Oba podejścia powodują jednak akceptowalne awarie w przypadku niepowodzenia autentycznych wywołań nagłówka HTTP (). Idealnie byłoby zawsze połączyć to z przyjazną dla użytkownika wiadomością i klikalnym linkiem w ostateczności. (Na przykład to, co robi rozszerzenie PECL http_redirect () .)

Dlaczego setcookie()i session_start()to również dotyczy

Zarówno setcookie()i session_start()trzeba wysłać Set-Cookie:nagłówek HTTP. Dlatego obowiązują te same warunki i podobne komunikaty o błędach będą generowane w przypadku przedwczesnych sytuacji wyjściowych.

(Oczywiście wpływają na to wyłączone pliki cookie w przeglądarce, a nawet problemy z serwerem proxy. Funkcjonalność sesji oczywiście zależy również od wolnego miejsca na dysku i innych ustawień php.ini itp.)

Dalsze linki

Mario
źródło
Również zwykły notepad.exe jest trudny. Używam NetBeans normalnie, który nie dodaje BOM, nawet jeśli plik jest tak zakodowany. Późniejsza edycja pliku w notatniku psuje wszystko, szczególnie w przypadku IIS jako serwera WWW. Wygląda na to, że Apache odrzuca (dodany jednostkowo) zestawienie komponentów.
Teson,
4
Usunięcie zamknięcia ?>z końca plików php jest zwykle dobrą praktyką, która pomaga również zminimalizować te błędy. Niepożądane białe znaki nie pojawią się na końcu plików i nadal będziesz mógł dodać nagłówki do odpowiedzi później. Jest to również przydatne, jeśli korzystasz z buforowania danych wyjściowych i nie chciałbyś widzieć dodanej niechcianej spacji na końcu części generowanych przez dołączone pliki.
Nikita
Dziwne, przeniosłem mój plik z cPanel Linux Hosting na VPS. Wcześniej działał poprawnie, ale tutaj pokazywał ten błąd (przed nagłówkiem miałem trochę kodu HTML). Dlaczego?
Pablo Escobar
@Purushotamrawat Czytałaś część o „ Ale to działało na innym serwerze !?
Mario
1
@PeterSMcIntyre BOM UTF8 prawdopodobnie (napraw to) / brak buforowania danych wyjściowych włączony (nie polegaj na tym).
mario
199

Ten komunikat o błędzie jest uruchamiany, gdy cokolwiek zostanie wysłane przed wysłaniem nagłówków HTTP (za pomocą setcookielub header). Typowe przyczyny wypisywania czegoś przed nagłówkami HTTP to:

  • Przypadkowe białe znaki, często na początku lub na końcu plików, takie jak to:

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

       Aby tego uniknąć, po prostu pomiń zamknięcie ?>- i tak nie jest wymagane.

  • Znaki kolejności bajtów na początku pliku php. Sprawdź swoje pliki php za pomocą edytora szesnastkowego, aby dowiedzieć się, czy tak jest. Powinny zaczynać się od bajtów 3F 3C. Możesz bezpiecznie usunąć BOM EF BB BFod początku plików.
  • Wyjście jawne, takie jak połączenia do echo, printf, readfile, passthru, kod przed <?etc.
  • Ostrzeżenie generowane przez php, jeśli ustawiono display_errorswłaściwość php.ini. Zamiast zawieszać się na błędzie programisty, php po cichu naprawia błąd i wysyła ostrzeżenie. Chociaż możesz modyfikować konfiguracje display_errorslub raportowanie błędów , powinieneś raczej rozwiązać problem.
    Typowe przyczyny to dostęp do niezdefiniowanych elementów tablicy (np. $_POST['input']Bez użycia emptylub w issetcelu sprawdzenia, czy dane wejściowe są ustawione), lub użycie niezdefiniowanej stałej zamiast literału łańcucha (jak w $_POST[input], zwróć uwagę na brakujące cudzysłowy).

Włączenie buforowania danych wyjściowych powinno rozwiązać problem; wszystkie dane wyjściowe po wywołaniu ob_startsą buforowane w pamięci do momentu zwolnienia bufora, np ob_end_flush. za pomocą .

Chociaż buforowanie danych wyjściowych pozwala uniknąć problemów, należy naprawdę ustalić, dlaczego aplikacja wysyła treść HTTP przed nagłówkiem HTTP. To byłoby jak odbieranie telefonu i omawianie twojego dnia i pogody przed powiadomieniem dzwoniącego, że ma zły numer.

phihag
źródło
pomóżcie mi dzięki
Vishwa Pratap,
122

Ten błąd występował już wiele razy i jestem pewien, że wszyscy programiści PHP przynajmniej raz otrzymali ten błąd.

Możliwe rozwiązanie 1

Ten błąd mógł być spowodowany pustymi spacjami przed rozpoczęciem pliku lub po jego zakończeniu. Nie powinno ich tu być.

Np. NIE POWINNY BYĆ TUTAJ NIEPRZERWANE MIEJSCA

   echo "your code here";

?>
THERE SHOULD BE NO BLANK SPACES HERE

Sprawdź wszystkie pliki związane z plikiem, który powoduje ten błąd.

Uwaga: Czasami EDITOR (IDE) jak gedit (domyślny edytor linux) dodaje jedną pustą linię do pliku zapisu. To nie powinno się zdarzyć. Jeśli używasz Linuksa. możesz użyć edytora VI, aby usunąć spację / linie po?> na końcu strony.

Możliwe rozwiązanie 2: Jeśli tak nie jest, użyj ob_start do buforowania danych wyjściowych:

<?php
  ob_start();

  // code 

 ob_end_flush();
?> 

Spowoduje to włączenie buforowania danych wyjściowych, a nagłówki zostaną utworzone po buforowaniu strony.

Manish Shrivastava
źródło
18
ob_start()po prostu ukrywa problem; nie używaj go do rozwiązania tego konkretnego problemu.
Ja͢ck
@ Ja͢ck Jeśli nie używam ob_start(), to co powinienem zrobić, aby rozwiązać ten problem:Headers already sent
Shafizadeh
@ Sajad, jeśli pojawia się błąd, szczególnie z powodu używanego edytora, powinieneś majstrować przy ustawieniach, aby przestał powodować problem lub zmienić edytory. Jeśli pojawia się błąd z jakiegokolwiek innego powodu, należy przeczytać odpowiedzi w tym pytaniu (w szczególności zaakceptowaną odpowiedź), aby dowiedzieć się, na czym polega problem i rozwiązać go.
Samsquanch
3
ob_start()nie „ukrywa” problemu, rozwiązuje problem.
TMS
1
Miałem taki problem, gdy przesyłałem moje pliki na serwer, który obsługiwał nawet PHP 5.3 Używaj serwera z PHP 5.6 lub więcej
GGSoft
86

Zamiast dolnej linii

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

pisać

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

lub

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

To na pewno rozwiąże twój problem. Napotkałem ten sam problem, ale rozwiązałem ten problem, pisząc lokalizację nagłówka w powyższy sposób.

Ipsita Rout
źródło
41

Ty robisz

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

przed ustawieniem plików cookie, co jest niedozwolone. Nie możesz wysłać żadnych danych wyjściowych przed nagłówkami, nawet pustej linii.

Seth Carnegie
źródło
32

Jest tak z powodu tej linii:

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

Nie należy nic drukować / echa przed wysłaniem nagłówków.

Sarfraz
źródło
31

CZĘSTE PROBLEMY:

(skopiowane z: źródło )

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

1)echo.. przed header(.......);poleceniem nie powinno być żadnych wyników (tj. Kodów HTML) .

2) usuń wszelkie spacje (lub znaki nowej linii ) przed <?phpi po ?>tagach.

3) ZŁOTA ZASADA! - sprawdź, czy ten plik php (a także, jeśli masz includeinne pliki) ma UTF8 bez kodowania BOM (a nie tylko UTF-8 ). Jest to problem w wielu przypadkach (ponieważ plik zakodowany w UTF8 ma na początku pliku php coś specjalnego, czego edytor tekstowy nie pokazuje) !!!!!!!!!!!

4) Po header(...);musisz użyćexit;

5) zawsze używaj referencji 301 lub 302:

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

6) Włącz raportowanie błędów i znajdź błąd. Twój błąd może być spowodowany niedziałającą funkcją. Po włączeniu raportowania błędów zawsze należy najpierw naprawić najwyższy błąd. Na przykład może to być „Ostrzeżenie: date_default_timezone_get (): poleganie na ustawieniach systemowych strefy czasowej systemu nie jest bezpieczne”. - następnie w dół możesz zobaczyć błąd „nagłówki nie zostały wysłane”. Po naprawieniu błędu najwyższego (1.) ponownie załaduj stronę. Jeśli nadal masz błędy, ponownie napraw błąd najwyższy.

7) Jeśli żadna z powyższych nie pomoże, użyj przekierowania JAVSCRIPT (jednak zdecydowanie niezalecana metoda), może być ostatnią szansą w niestandardowych przypadkach ...:

echo "<script type='text/javascript'>window.top.location='http://website.com/';</script>"; exit;
T.Todua
źródło
Dlaczego jest to ustawienie jawne 301lub 302ważne?
Jānis Elmeris
26

Prosta wskazówka: <?phpmoże to powodować prosta spacja (lub niewidoczny specjalny znak) w skrypcie, tuż przed pierwszym tagiem! Zwłaszcza, gdy pracujesz w zespole i ktoś używa „słabego” IDE lub popełnił błędy w plikach z dziwnymi edytorami tekstu.

Widziałem te rzeczy;)

Sliq
źródło
22

Kolejna zła praktyka może wywoływać ten problem, który nie został jeszcze określony.

Zobacz ten fragment kodu:

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

Wszystko w porządku, prawda?

Co jeśli „a_important_file.php” to:

<?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-------------------

To nie zadziała? Dlaczego? Ponieważ już generowana jest nowa linia.

Teraz, choć nie jest to częsty scenariusz, co zrobić, jeśli używasz frameworka MVC, który ładuje dużo plików przed przekazaniem rzeczy do kontrolera? To nie jest rzadki scenariusz. Przygotuj się na to.

Z PSR-2 2.2:


  • Wszystkie pliki PHP MUSZĄ używać Unix LF (linefeed) line ending.
  • Wszystkie pliki PHP MUSZĄ kończyć się na single blank line.
  • Znacznik zamykający?> MUSI pochodzić omittedz plików zawierającychonly php

Uwierz mi, przestrzeganie tych standardów może uratować Ci wiele godzin życia :)

MD Sahib Bin Mahboob
źródło
2
Zgodnie z kilkoma standardami (na przykład Zend) nie należy w żaden sposób umieszczać ?>znacznika zamykającego w żadnym pliku
Daniel W.
Nie mogę tego odtworzyć w środowisku Windows, ponieważ działa przy użyciu dowolnej kombinacji (dodawanie tagów zamykających, spacji, naciśnięcie klawisza Enter itp.). Wydaje się, że ten problem występuje głównie w środowiskach Linux.
Junior Mayhé,
@JuniorM Powinno to być powtarzalne. Czy możesz podzielić się kodem, którego eksperymentowałeś, w czymś podobnym?
MD. Sahib Bin Mahboob,
Korzystam z systemu Windows 7 z zainstalowanym najnowszym Wamp. Myślę, że ten błąd dotyczy ukrytych znaków na końcu linii. Przyczyną problemu był shortcodes.php mojego Wordpressa. Dodałem do tego pliku prostą funkcję i zaczął on uruchamiać ten błąd „wysłano nagłówki”. Porównałem mój shortcodes.php z wordpress 'i było w porządku, z wyjątkiem CR LF(typowego końca linii Windows). Rozwiązuję go, pobierając oryginalny plik z repozytorium Wordpress, który ma LF(Linux na końcu linii) zamiast, CR LFa także przeniosłem moją funkcję do funkcji functions.php. Na podstawie: bit.ly/1Gh6mzN
Junior
@Sahib, zauważ, że wciąż nie mogę odtworzyć tego, co jest zawarte w tej odpowiedzi. Odpowiedź jest całkowicie w porządku dla środowiska Linux. Testowałem rzeczy takie puste pomiędzy ?> <?php, usuwaniem i dodawaniem pojedynczej pustej linii, dodawaniem i pomijaniem tagu zamykającego ?>. W Windows + Wamp wszystkie te kombinacje działają dobrze. Wierd ...
Junior Mayhé
15

Czasami, gdy proces deweloperski ma zarówno stacje robocze WIN, jak i systemy LINUX (hosting), aw kodzie nie widać żadnych danych wyjściowych przed powiązaną linią, może to być formatowanie pliku i brak zakończenia linii Unix LF (linefeed) .

To, co zwykle robimy, aby to szybko naprawić, to zmiana nazwy pliku i w systemie LINUX utwórz nowy plik zamiast o zmienionej nazwie, a następnie skopiuj do niego zawartość. Wiele razy to rozwiązuje problem, ponieważ niektóre pliki utworzone w WIN po przeniesieniu do hostingu powodują ten problem.

Ta poprawka jest łatwą poprawką dla witryn, którymi zarządzamy przez FTP, i czasami może zaoszczędzić trochę czasu naszym nowym członkom zespołu.

Łubin
źródło
2

Zasadniczo ten błąd pojawia się, gdy wysyłamy nagłówek po echu lub drukowaniu. Jeśli ten błąd pojawia się na określonej stronie, upewnij się, że strona nic nie echa przed wywołaniem start_session().

Przykład nieprzewidywalnego błędu:

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

//your page content

Jeszcze jeden przykład:

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

//your page content

Wniosek: Nie wypisuj żadnego znaku przed wywołaniem session_start()ani header()nie działa on nawet na spację lub znak nowej linii

Biswadeep Sarkar
źródło