PHPにおけるHTTPレスポンスヘッダーの問題

HTTPの規則では、まずHTTPヘッダーが送信され、 その後でHTTPレスポンスの本体が送信されます。 このため、PHPの関数headerの取り扱いには 特有の注意点があります。

問題は、この関数を呼び出す前に何らかの画面出力がある場合、 それがレスポンス本体の開始と見なされてしまうことです。 この場合、関数headerの呼び出しは、 headers already sentというテキストの PHP警告を引き起こします。 この時、ヘッダー自体は送信されるかもしれません。 エラーが表示されないこともあります(PHPの設定に依存します)。 しかし、多くの場合、これはローカル環境でのみ発生し、 サイトをインターネットに公開するとすべてが壊れてしまいます。

画面出力とは、あらゆるテキストを意味します。 例えば、以下の通りです:

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

または空行:

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

またはスペース:

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

またはタグ:

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

またはechoによる出力:

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

またはvar_dumpによる出力:

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

PHPの警告でさえも画面出力となります。 次の例では、意図的に存在しない変数にアクセスし、 警告の出力を引き起こしています:

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

PHPの括弧の終了もまた画面出力を生成します:

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

意図的に、関数headerの前に画面出力を生成してください。 発生するエラーメッセージを調べてください。

Задание 2

このコードで犯されている間違いを修正してください:

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