HTTP válaszfejlécek problémája PHP-ban

A HTTP szabályai szerint először a HTTP fejlécek kerülnek elküldésre, majd csak azután a HTTP válasz törzse. Emiatt a header függvény használata PHP-ban sajátosságokkal jár.

Az a helyzet, hogy ha bármilyen kimenet kerül a képernyőre a függvény meghívása előtt, azt a válasz törzsének kezdeteként értelmezi. Ebben az esetben a header függvény meghívása PHP figyelmeztetést eredményez az headers already sent szöveggel. Ekkor a fejlécek akár el is küldődhetnek. Akár hiba sem jelenhet meg (ez a PHP beállításaitól függ). De legtöbbször ez csak a local környezeten történik, amikor pedig a weboldal felkerül az internetre, minden eltörik.

A képernyőre történő kimenet alatt bármilyen szöveg értendő. Például így:

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

Vagy egy üres sor:

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

Vagy egy szóköz:

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

Vagy egy tag:

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

Vagy kimenet a echo segítségével:

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

Vagy kimenet a var_dump segítségével:

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

Még a PHP figyelmeztetések is képernyőre kimenetnek számítanak. A következő példában szándékosan egy nem létező változóhoz történik hozzáférés, ami figyelmeztetés megjelenését eredményezi:

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

A PHP zárójelek közötti sortörések is képernyőre kimenetet generálnak:

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

Hozzon létre szándékosan kimenetet a képernyőn a header függvény előtt. Tanulmányozza a felmerülő hiba szövegét.

Задание 2

Javítsa a kódban elkövetett hibát:

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