Przy tworzeniu szablonu bloga natrafiłem na problem zamieszczony w tytule tego wpisu. Po włączeniu szablonu wyświetliło mi się ostrzeżenie:

Warning: Cannot modify header information – headers already sent by (output started at /home/wilgosz.pl/wp-content/themes/palmirtheme/functions.php:1) in /home/wilgosz.pl/wp-includes/option.php on line 568

Nie mogłem się wylogować z panelu admina, ani zalogować po wygaśnięciu sesji. Ostrzeżenie pojawiało się przy każdym dodaniu wpisu, kategorii czy jakiejkolwiek innej zmianie w strukturze witryny. Nie mogłem także korzystać z biblioteki mediów z poziomu wordpressa.

Przez jakiś czas nie mogłem sobie poradzić z jego likwidacją, a czytając na temat możliwości jego źródła, okazało się, że bardzo dużo osób ma ten sam problem. Jest on na tyle popularny, ze na ogromnej liczbie forów poruszane są tematy jego rozwiązania, więc nie powinno sprawiać problemu znalezienie rozwiązania. Niestety ludzie nie lubią korzystać z wyszukiwarek, a już na pewno nienawidzą sami docierać do informacji.

Dochodzi do tego, że forumowicze, zamiast udzielać informacji na temat rozwiązania awarii, odsyłają do przeglądarki. Dlatego szukając rozwiązania czołowe linki w przeglądarce przenoszą nas do tematów zamkniętych albo z odnośnikiem do Google, a do faktycznych odpowiedzi trzeba się dokopać.

Dlatego też postanowiłem wyjaśnić sedno tego problemu wraz z rozwiązaniem.

Cannot modify header information – headers already sent by

Ten problem zaliczany jest do najczęstszych problemów w PHP. W Wordpresie pojawia się najczęściej, kiedy edytujemy plik php-config.php za pomocą notatnika, jednak czasem, jak w moim przypadku, po edycji lub tworzeniu innych plików.

Ostrzeżenie to mówi nam, że nie możemy za pomocą PHP, wstawić nagłówków dla danej strony(najczęściej za pomocą funkcji header();), ponieważ wcześniej przekazaliśmy dla użytkownika (czyli do przeglądarki) jakieś dane (dowolny kod HTML, najczęściej wstawiony niepotrzebnie znak spacji lub enter). Nie jest to więc żaden błąd w funkcjach PHP czy JavaScript, więc nie musimy się martwić.

Po definicji następuje otwarcie nawiasu i komunikat: (output started at „Scieżka dostępu do pliku”) – jest to informacja o pliku, w którym popełniliśmy błąd. Ścieżki dostępu różnią się od serwerów i naszych portali, dlatego interesuje nas jedynie nazwa pliku.

Po zamknięciu nawiasu kolejna część ostrzeżenia to ścieżka dostępu do pliku, który nie może załadować nagłówków – ta ścieżka różni się zależnie od wykonywanej przez nas akcji, niemniej nie interesuje nas ona, ponieważ z tym plikiem jest wszystko w porządku.

Rozwiązanie

Rozwiązanie problemu jest dość proste. Najczęściej jego źródłem jest edycja pliku za pomocą notatnika, który koduje plik w UTF-8 z BOM. ( Warto zawsze zastanowić się, co oznacza komunikat o błędzie, niezależnie od tego, czy jest on po angielsku czy w jakimkolwiek innym języku. Cannot modify header information już samo w sobie mówi, co jest mniej więcej nie tak. Często do komunikatu dołączane są informacje o miejscach, w których można szukać rozwiązania lub czynnościach, które należy rozwiązać, żeby pozbyć się problemu. Dlatego zawsze czytajcie dokładnie komunikat o błędzie.)

BOM (Bite Order Mark) jest to znacznik kolejności bajtów, pozwalający na automatyczne wykrycie kodowania znaków(UTF-8, UTF-16 LE, etc.). Powiększa rozmiar danych o kilka bajtów. BOM nie jest zwykle używany w systemach gdzie z góry jest ustalony sposób kodowania, albo mają oddzielne mechanizmy deklaracji kodowania (znacznik meta w HTML, znaczniki XML itp.). Jeśli nie edytowaliśmy pliku w notatniku, tylko w edytorze przeznaczonym do tego celu(np. notatnik++ lub Adobe DreamWeaver), to po prostu gdzieś w pliku występują niepotrzebne znaki spacji lub enter.

Aby problem zniknął:

  1. Otwórz plik w edytorze html/php – w moim przypadku jest to DreamWeaver, jednak pokażę na przykładzie Notatnik++, ponieważ z powodu tego, że Notatnik++ jest darmowym oprogramowaniem, jest bardziej popularny.
  2. Sprawdź, czy przed znacznikami <?php nie ma zbędnych spacji i znaków enter, oraz czy nie ma ich po znacznikach ?> . W szczególności sprawdź początek i koniec pliku i usuń te znaki, jeśli występują.
  3. Zaznacz cały tekst i zmień format tekstu (wejdź w: Format -> UTF-8 bez BOM) i zapisz zmiany.
  4. Jeśli nie edytowaliśmy wcześniej pliku w notatniku, prawdopodobnie wystarczy usunąć nadmiarowe znaki.
  5. Wrzuć plik na serwer i nadpisz stary.

Koniec. Powyższe działania niemal zawsze rozwiązują dany problem.

Czasem jednak kłopot występuje w więcej niż jednym pliku i usunięcie usterki z pliku wyświetlanego przez ostrzeżenie nie spowoduje żadnych zmian oprócz tego, że nazwa pliku, w którym wykryto problem się zmieni. Często cała ścieżka dostępu jest identyczna, tylko nazwa pliku się różni, dlatego zmiana w ostrzeżeniu jest łatwa do przeoczenia.

Tak było w moim przypadku. Usunąłem błąd z pliku funkcji, jednak na pierwszy rzut oka nic się nie zmieniło. WTF? – Pomyślałem i wtedy zacząłem czytać, szukać, zastanawiać się i analizować. Okazało się, błąd musiałem usunąć z dwóch plików o tej samej ścieżce dostępu. Nie zauważyłem zmiany nazwy pliku i straciłem kilka dni na usunięcie banalnej wręcz usterki 😀 . No ale cóż, taki los programisty 😉

Proszę Cię jeszcze, że jeśli ten wpis Ci pomógł zostaw komentarz na dole wpisu, lub polub tę stronę.

 

Sekrety Produktywności

Sekrety Produktywności

DARMOWE szkolenie mailingowe! 10 porad jak zwiększyć produktywność w programowaniu.

Dziękujemy za zapisanie się na kurs. Wkrótce otrzymasz wiadomość email z potwierdzeniem zapisu.

Polub nas na facebooku!

Jeśli podoba Ci się ten blog, polub nas na facebooku! Dzięki temu nie ominą Cię nowe treści!

You have Successfully Subscribed!