PHP-তে HTTP রেসপন্স হেডারের সমস্যা

HTTP নিয়ম অনুসারে, প্রথমে HTTP হেডার প্রেরণ করা হয়, এবং তারপর HTTP রেসপন্সের বডি। এই কারণে PHP-তে header ফাংশন ব্যবহারের কিছু নিজস্ব বৈশিষ্ট্য রয়েছে।

সমস্যাটি হল যে, যদি এই ফাংশনটি কল করার আগে পর্দায় কোনো আউটপুট থাকে, তাহলে সেটিকে রেসপন্স বডির শুরু হিসেবে বিবেচনা করা হবে। এই ক্ষেত্রে, header ফাংশন কল করলে PHP একটি সতর্কবার্তা দেবে "headers already sent" লেখাসহ। এমনকি হেডারগুলি পাঠানোও হতে পারে। এমনকি ত্রুটিটিও প্রদর্শিত নাও হতে পারে (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>