Problem med HTTP-svarshoveder i PHP

Ifølge HTTP-reglerne sendes HTTP-hoveder først, og derefter HTTP-svarsteksten. På grund af dette har arbejdet med funktionen header i PHP sine særligheder.

Faktum er, at hvis der er noget output til skærmen før kald til denne funktion, vil det blive fortolket som starten på svarsteksten. I dette tilfælde vil et kald til funktionen header føre til en PHP-advarsel med teksten headers already sent. I dette tilfælde kan hovederne muligvis sendes. Fejlen vises måske ikke engang (afhængigt af PHP-indstillingerne). Men oftest vil dette kun ske på den lokale maskine, og når hjemmesiden lægges på internettet, går det i stykker.

Med output til skærmen menes enhver tekst. For eksempel sådan her:

phptext
<?php
  header('Content-Type: text/html');
?>

Eller en tom linje:

php     
<?php
  header('Content-Type: text/html');
?>

Eller et mellemrum:

php <?php
  header('Content-Type: text/html');
?>

Eller et tag:

html<div>
  <?php
    header('Content-Type: text/html');
  ?>
</div>

Eller output via echo:

php<?php
  echo 'abc';
  header('Content-Type: text/html');
?>

Eller output via var_dump:

php<?php
  $str = 'abc';
  var_dump($str);
  
  header('Content-Type: text/html');
?>

Selv PHP-advarsler vil være output til skærmen. I det følgende eksempel henvises der med vilje til en ikke-eksisterende variabel, hvilket vil føre til output af en advarsel:

php<?php
  $text += 1;
  header('Content-Type: text/html');
?>

Ophævelser af PHP-parenteser genererer også output til skærmen:

php<?php
  echo 'abc';
?>
<?php
  header('Content-Type: text/html');
?>
Задание 1

Skab med vilje output til skærmen før funktionen header. Undersøg teksten i den opståede fejl.

Задание 2

Ret fejlen begået i denne kode:

html<!DOCTYPE html>
<html>
  <head>
    <?php
      header('Content-Type: text/html');
    ?>
  </head>
  <body>
    text
  <body>
<html>