Artykuły na każdy temat

[PHP] headers already sent by

Dodano 29.09.2009r. o 05:04

Omówienie

Dość częstym i banalnym błędem jest headers already sent by, który pojawia się w momencie próby wysłania nagłówków do przeglądarki. Oznacza to, że przed wysłaniem jakichkolwiek treści strony musimy wysłać wszystkie nagłówki. Najczęściej problem stwarzany jest przez użycie funkcji session_start() lub setcookie(). Poniższy przykład wygeneruję nam omawiany błąd.
Kod:
<?php
echo 'hello there!';
// Zainicjowanie sesji
session_start();
?>
Aby rozwiązać problem wystarczy przesunąć session_start() na początek w ten sposób:
Kod:
<?php
// Zainicjowanie sesji
session_start();

echo 'hello there!';
?>

Includowanie i headers already sent by

Kolejną sprawę, która trzeba omówić są pliki includowane. Przypuścmy, że to jest nasz index.php:
Kod:
<?php
include './a.php';
include './b.php';

// Zainicjowanie sesji
session_start();
?>
ten to: a.php
Kod:
<?php
$init false;
?>
a poniższy to: b.php
Kod:
 <?php
echo '$init = '.($init === true 'true' 'false');
?>
Najlepszym rozwianiem tego problemu jest inicjowanie mechanizmu sesji na początku pliku głównego czyli index.php powinien wyglądać tak:
Kod:
<?php
// Zainicjowanie sesji
session_start();
// Inne operacje
include './a.php';
include './b.php';
?>

Używanie bufora ob_start()

Niby to jest proste lecz co w przypadku kiedy trzeba będzie wysłać cookie w środku skryptu? Tutaj kłania się budowa skryptu. Normalnie wygląda to w ten sposób, że najpierw jest generowana cała strona, a dopiero na końcu parsowana i wysyłana do przeglądarki. W naszym wypadku kiedy wysłaliśmy już coś do przeglądarki z pomocą przychodzi nam bufor. Poniżej znajduję się przykład jak go zastosować.
Kod:
<?php
ob_start(); // Definitywnie na początku
?>
<html>
 <head>
 </head>
 <body>
  <?php
  echo 'I like bananas';
  setcookie('TestCookie''The banana');
  ?>
 </body>
</html>
<?php
ob_end_flush();
?>
Jedyne co musimy pamiętać to fakt, że ob_start() umieszczamy na samym początku pliku zaś ob_end_flush() na końcu.

session_start() na początku i nadal jest błąd

Czasami zdarza się, że mamy taki oto kod:
Kod:
<?php
session_start();
?>
Na pierwszy rzut oka powinno działać lecz jeżeli nowicjusz zapisze ów kod w notatniku to ten kochany program doda na początku pliku zbędne znaki, które są powodem problemów. Odpowiednie kodowanie pliku ma znaczenie dlatego też przestrzegam przed takimi praktykami! Wyjątkiem od reguły może być parametr auto_prepend_file w php.ini. Może się zdarzyć, że serwer będzie dorzucał automatycznie jakiś plik przed wygenerowaniem naszej strony. Sytuacje te są sporadycznie spotykane! Pamiętajmy, że używanie bufora może spowolnić dzianie serwisu szczególnie przy dużej ilości użytkowników dlatego też staramy się dobrze pisać aplikacje webowe i stosować ob_start() w ostatecznosci Wink

Więcej informacji na:
http://php.net/manual/pl/function.ob-end-flush.php
http://php.net/manual/pl/function.ob-start.php
http://php.net/manual/pl/function.session-start.php

Komentarze

Brak komentarzy

Dodaj komentarz

Zostaw komentarz jeżeli możesz! Nie bądź przysłowiowym botem! Nie bądź obojętny! Ciebie to nic nie kosztuje, a mi sprawi uśmiech na twarzy.
Zezwolono używać: BBCode
Zabroniono używać:
znaczników HTML

(Wymagany)

(Wymagany, niepublikowany)

(Nie wymagana)

Token:

Obrazek dla bota

(Przepisz tylko cyfry!)

(Wymagana)