Problème avec les en-têtes de réponse HTTP en PHP

Selon les règles HTTP, les en-têtes HTTP sont d'abord envoyés, puis le corps de la réponse HTTP. Pour cette raison, l'utilisation de la fonction header en PHP a ses particularités.

Le fait est que si une sortie est effectuée à l'écran avant l'appel de cette fonction, elle sera interprétée comme le début du corps de la réponse. Dans ce cas, l'appel de la fonction header entraînera un avertissement PHP avec le texte headers already sent. Dans ce cas, les en-têtes pourraient même être envoyés. L'erreur pourrait même ne pas s'afficher (cela dépend des paramètres PHP). Mais le plus souvent, cela ne se produira que en local, et lors du déploiement du site sur Internet, tout va casser.

Par sortie à l'écran, on entend n'importe quel texte. Par exemple, comme ceci :

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

Ou une ligne vide :

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

Ou un espace :

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

Ou une balise :

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

Ou une sortie via echo :

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

Ou une sortie via var_dump :

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

Même les avertissements PHP constituent des sorties à l'écran. Dans l'exemple suivant, on accède intentionnellement à une variable inexistante, ce qui entraînera l'affichage d'un avertissement :

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

Les fermetures de balises PHP génèrent également une sortie à l'écran :

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

Créez intentionnellement une sortie à l'écran avant la fonction header. Étudiez le texte de l'erreur qui se produit.

Задание 2

Corrigez l'erreur commise dans ce code :

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