Varför får man inte skicka någon header efter man skickat någon output?

Ett vanligt nybörjarfel inom PHP är att man försöker att skicka headers efter man skickat någon output.
Gör man det kommer man troligtvis få felmeddelandet:
Warning: Cannot modify header information - headers already sent osv…

Om man söker information om felmeddelandet så kommer man nog ofta hitta svaret att ”Skicka inga headers efter du skickat någon output”.

Svaret i sig säger inte speciellt mycket om vad det är och hur man kan lösa problemet.
Jag kommer att gå igenom det lite grundligare.

Vad är en header?

Headers är instruktioner till webbläsaren som talar om hur det som kommer från servern ska behandlas.
En header kan även vara styrkod som t.ex. en session, cookie osv…

Vad är en output?

Output är själva hemsidan. T.ex. länkar, bilder, mellanslag.
Så fort man i sin kod har ett mellanslag, en radbrytning en utskrift med echo osv… så har man börjat skicka sin output.

Hur funkar det?

För att webbläsaren ska kunna tolka vissa saker i koden så måste webbläsaren informeras (få headers) innan om att det kommer.
Det finns olika headers för olika saker.
En header kan t.ex. säga att det kommer att finnas en jpg-bild på sidan.

Koden genereras på servern, servern skickar headers till webbläsaren, webbläsaren tolkar dom, servern skickar outputen till webbläsaren.

Först berättar man för webbläsaren vad som kommer att skickas, sen skickar man det.

Headers skickas ofta utan att man märker det eftersom man inte ser dom på hemsidan eller i den färdiggenererade koden.
Fast ofta brukar man kunna se dom i webbläsaren.

Kan man komma runt ”problemet”?

Ja, det kan man.
Man kan i sin php.ini fil leta upp Output Buffering och ändra den från Off till On.
Man kan använda också i början av sin kod lägga in ob_start.
Men det bästa alternativet är att anpassa sin kod så att det inte skickas några header efter output.

Nackdelar med att tillåta output buffering?

Det känns ganska logiskt. Om det inte hade funnits någon nackdel med att tillåta det hade man självklart gjort det som standard.

Om man tillåter output buffering så samlar man hela outputens innehåll i serverns internminne (buffer). Därav namnet ”Output Buffering”.
Är det många besökare på servern så kan det tröga ner sidvisningen.
Om man kollar i Exempel 4 så är det lättare att förstå.

Har man t.ex. en databashämtning på sidan som tar lite tid så måste användaren sitta och vänta medans hela sidan byggs upp på servern innan den skickas till webbläsaren.
Har man inte outputbuffrat så kan menyn och liknande skickas till webbläsaren under tiden databaskörningen arbetar vilket leder till en snabbare sida.

Exempel

Exempel 1 - Inloggingssida.
Exempel 2 - Visa en jpg-bild.
Exempel 3 - Skillnad med Output Buffering On / Off med samma kod.
Exempel 4 - Illustration av effekten
( tråd med exempel ) http://www.phpportalen.net/viewtopic.php?t=74341
Wiki-navigering
Wiki Index
Wiki Artiklar
Wiki Skolan
Wiki Guider
Wiki FAQ
Webbhotell
Domänregistrering
Wiki-sökning
Sök:
Dokumentalternativ
Redigera dokumentet
Visa dokumenthistorien
Senaste wiki-ändringar
Visa ändringarna
Inställningar
Wiki inställningar
Bra att veta
Vad är en Wiki?
Våra förhållningsregler
Trivselregler
Att använda Wikin
Kontakta oss på adressen: info@phpportalen.net
Webbplatsen bygger i grunden på phpBB 2.0.4 © 2001, 2002 phpBB Group

Modifieringar har senare gjorts i systemet av PHPportalen
Sid och logotypdesign skapad av Daren Jularic