শিরোনাম পাঠানোর আগে কোনও আউটপুট নেই!
যে কোনও ফাংশন HTTP শিরোনাম প্রেরণ / সংশোধন করে কোনও আউটপুট তৈরি হওয়ার আগে অবশ্যই তাকে ডেকে আনতে হবে ।
summary ⇊
অন্যথায় কল ব্যর্থ হয়:
সতর্কতা: শিরোনাম তথ্য পরিবর্তন করতে পারে না - শিরোনাম ইতিমধ্যে প্রেরণ করা হয়েছে ( স্ক্রিপ্টে আউটপুট শুরু হয়েছে : লাইন )
HTTP শিরোনাম পরিবর্তনকারী কিছু ফাংশনগুলি হ'ল:
আউটপুট হতে পারে:
ইচ্ছাকৃত:
print
, echo
এবং আউটপুট উত্পাদন অন্যান্য ফাংশন
- কাঁচা
<html>
বিভাগ পূর্ব <?php
কোড।
কেন এমন হয়?
আউটপুট দেওয়ার আগে শিরোনামগুলি কেন পাঠানো উচিত তা বোঝার জন্য একটি সাধারণ এইচটিটিপি
প্রতিক্রিয়াটি দেখার প্রয়োজন। পিএইচপি স্ক্রিপ্টগুলি মূলত এইচটিএমএল সামগ্রী তৈরি করে, তবে ওয়েব সার্ভারে এইচটিটিপি / সিজিআই শিরোনামগুলির একটি সেটও দেয়:
HTTP/1.1 200 OK
Powered-By: PHP/5.3.7
Vary: Accept-Encoding
Content-Type: text/html; charset=utf-8
<html><head><title>PHP page output page</title></head>
<body><h1>Content</h1> <p>Some more output follows...</p>
and <a href="/"> <img src=internal-icon-delayed> </a>
পৃষ্ঠা / আউটপুট সর্বদা শিরোনাম অনুসরণ করে। পিএইচপি প্রথমে শিরোনামটি ওয়েব সার্ভারে পাস করতে হয়। এটি কেবল একবারেই এটি করতে পারে। ডাবল লাইন ব্রেকের পরে এগুলি আর কখনও সংশোধন করতে পারে না।
যখন পিএইচপি প্রথম আউটপুট পায় ( print
, echo
, <html>
) এটি হবে
ফ্লাশ সব সংগৃহীত হেডার। এরপরে এটি যা চায় তার আউটপুট প্রেরণ করতে পারে। তবে আরও এইচটিটিপি শিরোনাম পাঠানো তখন অসম্ভব।
অকাল আউটপুট কোথায় ঘটেছে তা আপনি কীভাবে আবিষ্কার করতে পারেন?
header()
সাবধানবাণী সমস্যা কারণ খোজা সমস্ত প্রাসঙ্গিক তথ্য রয়েছে:
সতর্কতা: শিরোনাম তথ্য সংশোধন করতে পারে না - শিরোনাম 100 এর লাইনে /www/usr2345/htdocs/index.php এ ইতিমধ্যে প্রেরিত
(আউটপুট / www / usr2345 / htdocs / auth.php: 52 এ ) প্রেরিত হয়েছে
এখানে "লাইনের 100" স্ক্রিপ্ট যেখানে বোঝায় header()
আবাহন ব্যর্থ হয়েছে।
প্রথম বন্ধনের মধ্যে " আউটপুট শুরু হয়েছে " নোটটি আরও তাৎপর্যপূর্ণ। এটি পূর্ববর্তী আউটপুটটির উত্সকে চিহ্নিত করে। এই উদাহরণে এটি auth.php
এবং লাইন52
। সেখানেই আপনাকে অকালীন আউটপুট সন্ধান করতে হবে।
সাধারণ কারণ:
প্রিন্ট, প্রতিধ্বনি
ইচ্ছাকৃত আউটপুট print
এবং echo
বিবৃতিগুলি এইচটিটিপি শিরোনাম প্রেরণের সুযোগকে সমাপ্ত করবে। অ্যাপ্লিকেশন প্রবাহটি এড়াতে অবশ্যই পুনর্গঠন করতে হবে। ফাংশন
এবং টেম্প্লেটিং প্রকল্পগুলি ব্যবহার করুন । বার্তা লিখিত header()
হওয়ার আগেই কলগুলি ঘটেছিল তা নিশ্চিত করুন ।
আউটপুট উত্পাদন করে এমন কার্যাদি অন্তর্ভুক্ত
print
, echo
, printf
,vprintf
trigger_error
, ob_flush
, ob_end_flush
, var_dump
,print_r
readfile
, passthru
, flush
, imagepng
,imagejpeg
অন্যদের মধ্যে এবং ব্যবহারকারীর দ্বারা সংজ্ঞায়িত ফাংশন।
কাঁচা এইচটিএমএল অঞ্চল
কোনও .php
ফাইলের আনপারসড এইচটিএমএল বিভাগগুলি হ'ল সরাসরি আউটপুট। স্ক্রিপ্ট শর্তাদি যে কোনও header()
কলকে ট্রিগার করবে তা কোনও কাঁচা <html>
ব্লকের আগে অবশ্যই লক্ষ করা উচিত ।
<!DOCTYPE html>
<?php
// Too late for headers already.
আউটপুট যুক্তি থেকে প্রক্রিয়াজাতকরণ পৃথক করতে একটি টেম্প্লেটিং স্কিম ব্যবহার করুন।
- স্ক্রিপ্টগুলির উপরে ফর্ম প্রসেসিং কোড রাখুন।
- বার্তা স্থগিত করতে অস্থায়ী স্ট্রিং ভেরিয়েবলগুলি ব্যবহার করুন।
- প্রকৃত আউটপুট যুক্তি এবং অন্তর্নির্মিত এইচটিএমএল আউটপুট শেষ অনুসরণ করা উচিত।
<?php
"স্ক্রিপ্ট.এফপি লাইন 1 " সতর্কতাগুলির জন্য হোয়াইটস্পেসের আগে
যদি সতর্কতাটি আউটপুটটিকে লাইনে বোঝায় 1
, তবে এটি খোলার টোকেনের আগে বেশিরভাগ ক্ষেত্রেই হোয়াইটস্পেস , পাঠ্য বা এইচটিএমএল শীর্ষস্থানীয় <?php
।
<?php
# There's a SINGLE space/newline before <? - Which already seals it.
একইভাবে এটি সংযুক্ত স্ক্রিপ্ট বা স্ক্রিপ্ট বিভাগগুলির জন্য ঘটতে পারে:
?>
<?php
পিএইচপি প্রকৃতপক্ষে নিকটবর্তী ট্যাগগুলির পরে একটি একক লাইনব্রেক খায় । তবে এটি এমন শূন্যস্থানগুলিতে স্থানান্তরিত একাধিক নিউলাইন বা ট্যাব বা স্থানগুলিকে ক্ষতিপূরণ দেবে না।
ইউটিএফ -8 বিওএম
একাই লাইন ব্রেক এবং স্পেসগুলি সমস্যা হতে পারে। তবে "অদৃশ্য" চরিত্রের ক্রমগুলিও এটির কারণ হতে পারে। সর্বাধিক বিখ্যাত
ইউটিএফ -8 বিওএম (বাইট-অর্ডার-মার্ক)
যা বেশিরভাগ পাঠ্য সম্পাদক দ্বারা প্রদর্শিত হয় না। এটি বাইট সিকোয়েন্স EF BB BF
, যা ইউটিএফ -8 এনকোডযুক্ত নথিগুলির জন্য alচ্ছিক এবং রিডানডেন্ট ant পিএইচপি যদিও এটি কাঁচা আউটপুট হিসাবে বিবেচনা করতে হবে। এটি 
আউটপুটে অক্ষর হিসাবে প্রদর্শিত হতে পারে (যদি ক্লায়েন্ট নথিটি ল্যাটিন -১ হিসাবে ব্যাখ্যা করে) বা অনুরূপ "আবর্জনা"।
বিশেষভাবে গ্রাফিকাল সম্পাদক এবং জাভা ভিত্তিক আইডিই এর উপস্থিতি থেকে গাফেল থাকে। তারা এটি কল্পনা করে না (ইউনিকোড স্ট্যান্ডার্ড দ্বারা বাধ্য) বেশিরভাগ প্রোগ্রামার এবং কনসোল সম্পাদকরা তা করেন:
সমস্যাটি প্রাথমিকভাবে সনাক্ত করা সহজ। অন্য সম্পাদকদের একটি ফাইল / সেটিংস মেনুতে তার উপস্থিতি চিহ্নিত (নোটপ্যাড ++, Windows এ শনাক্ত ও করতে পারে
সমস্যা প্রতিকার BOMs উপস্থিতি একটি অবলম্বন করা হয় পরিদর্শন আরেকটি বিকল্প), hexeditor । * নিক্স সিস্টেমে hexdump
সাধারণত উপলব্ধ থাকে, যদি না গ্রাফিকাল ভেরিয়েন্ট যা এই এবং অন্যান্য সমস্যার নিরীক্ষণকে সহজতর করে:
একটি সহজ সমাধান হ'ল "ইউটিএফ -8 (কোনও বিওএম নেই)" বা অনুরূপ নামকরণ হিসাবে ফাইল সংরক্ষণের জন্য পাঠ্য সম্পাদককে সেট করা। প্রায়শই নতুন আগতরা অন্যথায় নতুন ফাইল তৈরি করে এবং পূর্ববর্তী কোডটি অনুলিপি করে পেস্ট করে।
সংশোধন ইউটিলিটিস
পাঠ্য ফাইল ( sed
/awk
অথবা recode
) পুনরায় লেখার জন্য আবার স্বয়ংক্রিয় সরঞ্জাম রয়েছে । পিএইচপি জন্য বিশেষত phptags
ট্যাগ পরিদর্শন আছে । এটি দীর্ঘ এবং সংক্ষিপ্ত ফর্মগুলিতে ঘনিষ্ঠ এবং খোলার ট্যাগগুলিকে আবারও লিখেছেন, তবে খুব সহজেই নেতৃস্থানীয় এবং অনুসরণযোগ্য শ্বেত স্থান, ইউনিকোড এবং ইউটিএফ-এক্স বিওএম সমস্যাগুলি সমাধান করে:
phptags --whitespace *.php
এটি সম্পূর্ণ অন্তর্ভুক্ত বা প্রকল্প ডিরেক্টরিতে ব্যবহার করা বুদ্ধিমান।
হোয়াইটস্পেস পরে ?>
যদি ত্রুটির উত্সটি বন্ধের?>
পিছনে হিসাবে উল্লেখ করা থাকে
তবে এটি হ'ল এখানে কিছু সাদা জায়গা বা কাঁচা লেখা লেখা হয়েছে। পিএইচপি সমাপ্তি চিহ্নিতকারী এই মুহুর্তে স্ক্রিপ্টের সম্পাদন বন্ধ করে দেয় না। এটির পরে যে কোনও পাঠ্য / স্থানের অক্ষরগুলি পৃষ্ঠার সামগ্রী হিসাবে লেখা হবে।
এটি সাধারণত পরামর্শ দেওয়া হয়, বিশেষত আগতদের কাছে, ?>
পিএইচপি-র নিকটবর্তী ট্যাগগুলি বাদ দেওয়া উচিত। এই eschews এইসব ক্ষেত্রে একটি ছোট অংশ। (বেশিরভাগ include()d
স্ক্রিপ্টগুলিই অপরাধী))
ত্রুটির উত্স "0 লাইনে অজানা" হিসাবে উল্লেখ করা হয়েছে
এটি কোনও পিএইচপি এক্সটেনশান বা php.ini সেটিংস যদি কোনও ত্রুটি উত্সকে সংহত না করা হয়।
- এটি মাঝেমধ্যে
gzip
স্ট্রিম এনকোডিং সেটিংস
বাob_gzhandler
।
- তবে এটি কোনও দ্বিগুণ লোড হওয়া
extension=
মডিউলও হতে পারে যা অন্তর্নিহিত পিএইচপি স্টার্টআপ / সতর্কতা বার্তা উত্পন্ন করে।
পূর্ববর্তী ত্রুটি বার্তা
যদি অন্য কোনও পিএইচপি বিবৃতি বা অভিব্যক্তি কোনও সতর্কতা বার্তা বা নোটিশ মুদ্রিত হওয়ার কারণ হয়ে থাকে তবে তা অকালীন আউটপুট হিসাবেও গণনা করা হয়।
এই ক্ষেত্রে আপনাকে ত্রুটিটি রোধ করতে হবে, বিবৃতি কার্যকর করতে বিলম্ব করতে হবে বা বার্তাটি দমন করতে হবে উদাহরণস্বরূপ
isset()
বা @()
- যখন হয় পরে ডিবাগিংকে বাধা দেয় না।
কোনও ত্রুটির বার্তা নেই
যদি আপনার প্রতি error_reporting
বা display_errors
অক্ষম হয়ে থাকে php.ini
তবে কোনও সতর্কতা প্রদর্শিত হবে না। তবে ত্রুটিগুলি উপেক্ষা করার ফলে সমস্যাটি দূরে যাবে না। অকালীন ফলাফলের পরে শিরোনামগুলি এখনও পাঠানো যায় না।
সুতরাং যখন header("Location: ...")
পুনঃনির্দেশগুলি নিঃশব্দে ব্যর্থ হয় তখন সতর্কতার জন্য তদন্ত করা খুব পরামর্শ দেওয়া উচিত। অনুরোধ স্ক্রিপ্টের উপরে দুটি সাধারণ কমান্ড দিয়ে তাদের পুনরায় সক্ষম করুন:
error_reporting(E_ALL);
ini_set("display_errors", 1);
বা set_error_handler("var_dump");
অন্য সব যদি ব্যর্থ হয়।
পুনঃনির্দেশ শিরোনামের কথা বলতে গেলে আপনার প্রায়শই চূড়ান্ত কোড পাথের জন্য এই জাতীয় প্রতিমা ব্যবহার করা উচিত:
exit(header("Location: /finished.html"));
অগ্রাধিকার এমনকি একটি ইউটিলিটি ফাংশন, যা header()
ব্যর্থতার ক্ষেত্রে কোনও ব্যবহারকারী বার্তা মুদ্রণ করে ।
কাজের হিসাবে আউটপুট বাফারিং
পিএইচপি গুলি আউটপুট বাফারিং
এই সমস্যাটি হ্রাস করার জন্য এক কার্যকরী কাজ। এটি প্রায়শই নির্ভরযোগ্যভাবে কাজ করে, তবে সঠিক অ্যাপ্লিকেশন কাঠামোগতকরণ এবং নিয়ন্ত্রণ যুক্তি থেকে আউটপুট পৃথক করার বিকল্প হওয়া উচিত নয়। এর আসল উদ্দেশ্যটি হ'ল ওয়েব সার্ভারে স্থানান্তর হ্রাস করা।
output_buffering=
সেটিং তবুও সাহায্য করতে পারেন। আধুনিক এফপিএম / ফাস্টসিজিআই সেটআপগুলিতে এটি php.ini
বা .htaccess
বা এমনকি .user.ini এর মাধ্যমে কনফিগার করুন।
এটি সক্ষম করে পিএইচপিটিকে তাত্ক্ষণিকভাবে ওয়েব সার্ভারে পাস করার পরিবর্তে আউটপুটটিকে বাফার করার অনুমতি দেবে। পিএইচপি এইভাবে এইচটিটিপি শিরোনামকে একত্রিত করতে পারে।
এটি অনুরূপভাবে ob_start();
স্ক্রিপ্টের উপরে যাওয়ার জন্য কোনও কলের সাথে জড়িত থাকতে পারে । যা একাধিক কারণে কম নির্ভরযোগ্য:
এমনকি যদি <?php ob_start(); ?>
শুরু হয় প্রথম স্ক্রিপ্ট, হোয়াইটস্পেস বা BOM সামনে এলোমেলো পেতে পারে, এটা অকার্যকর রেন্ডারিং ।
এটি এইচটিএমএল আউটপুটটির জন্য সাদা স্থানকে গোপন করতে পারে। তবে অ্যাপ্লিকেশন যুক্তি বাইনারি সামগ্রী (উদাহরণস্বরূপ একটি উত্পন্ন চিত্র) প্রেরণের চেষ্টা করার সাথে সাথে বাফার এক্সট্রান্সিয়াস আউটপুট একটি সমস্যা হয়ে দাঁড়ায়। (আরও বেশি কাজ করার দরকার নেই ob_clean()
))
বাফারটি আকারে সীমাবদ্ধ এবং ডিফল্ট থেকে ছেড়ে গেলে সহজেই ওভাররন করতে পারে। এবং এটি কোনও বিরল ঘটনা নয়,
যখন এটি ঘটে তখন ট্র্যাক করা কঠিন ।
উভয় পন্থা তাই অবিশ্বাস্য হতে পারে - বিশেষত যখন বিকাশ সেটআপগুলি এবং / অথবা প্রোডাকশন সার্ভারগুলির মধ্যে স্যুইচ করা হয়। যে কারণে আউটপুট বাফারিংকে কেবল একটি ক্রাচ / কঠোরভাবে একটি workaround হিসাবে বিবেচনা করা হয়।
ম্যানুয়ালটিতে বুনিয়াদি ব্যবহারের উদাহরণটি দেখুন , এবং আরও ভাল জিনিসগুলির জন্য:
তবে এটি অন্য সার্ভারে কাজ করেছে !?
আপনি যদি আগে শিরোনাম সতর্কতা না পান তবে আউটপুট বাফারিং php.ini সেটিংস
পরিবর্তন হয়ে গেছে। এটি সম্ভবত বর্তমান / নতুন সার্ভারে অ-কনফিগার করা হয়েছে।
সাথে চেক করা হচ্ছে headers_sent()
headers_sent()
যদি এখনও ... হেডার পাঠানো সম্ভব হয় তবে আপনি অনুসন্ধানের জন্য সর্বদা ব্যবহার করতে পারেন। যা শর্তাধীন কোনও তথ্য মুদ্রণ করতে বা অন্যান্য ফ্যালব্যাক যুক্তি প্রয়োগ করতে দরকারী apply
if (headers_sent()) {
die("Redirect failed. Please click on this link: <a href=...>");
}
else{
exit(header("Location: /user.php"));
}
দরকারী ফলব্যাক workarounds হ'ল:
এইচটিএমএল <meta>
ট্যাগ
যদি আপনার অ্যাপ্লিকেশনটি কাঠামোগতভাবে ফিক্স করা শক্ত হয়, তবে পুনর্নির্দেশগুলি মঞ্জুরি দেওয়ার একটি সহজ (তবে কিছুটা পেশাদারহীন) উপায় একটি এইচটিএমএল <meta>
ট্যাগকে ইনজেকশন দিচ্ছে
। একটি পুনর্নির্দেশ এর মাধ্যমে অর্জন করা যেতে পারে:
<meta http-equiv="Location" content="http://example.com/">
বা অল্প বিলম্বের সাথে:
<meta http-equiv="Refresh" content="2; url=../target.html">
<head>
বিভাগটি অতীত ব্যবহার করার সময় এটি অ-বৈধ এইচটিএমএল বাড়ে । বেশিরভাগ ব্রাউজার এখনও এটি গ্রহণ করে।
জাভাস্ক্রিপ্ট পুনর্নির্দেশ
বিকল্প হিসাবে একটি জাভাস্ক্রিপ্ট পুনর্নির্দেশ
পৃষ্ঠা পুনঃনির্দেশগুলির জন্য ব্যবহার করা যেতে পারে:
<script> location.replace("target.html"); </script>
যদিও এটি প্রায়শই HTML এর সাথে সামঞ্জস্যপূর্ণর চেয়ে বেশি উপযুক্ত <meta>
, তবে এটি জাভাস্ক্রিপ্ট-সক্ষম ক্লায়েন্টগুলির উপর নির্ভরতা তৈরি করে।
সত্যিকারের HTTP শিরোনাম () কল ব্যর্থ হলে উভয় পদ্ধতিরই গ্রহণযোগ্য ফলব্যাকগুলি হয়। আদর্শভাবে আপনি সর্বদা এটি একটি ব্যবহারকারী-বান্ধব বার্তা এবং ক্লিকযোগ্য লিঙ্কের সাথে সর্বশেষ সমাধান হিসাবে একত্রিত করতে চান। (উদাহরণস্বরূপ যা হ'ল পিইসিএল
এক্সটেনশনটি http_redirect () করে)
কেন setcookie()
এবং session_start()
এছাড়াও প্রভাবিত হয়
উভয়ই setcookie()
এবং এইচটিটিপি শিরোনাম session_start()
প্রেরণ করা দরকার Set-Cookie:
। একই শর্তাবলী তাই প্রযোজ্য এবং অকালীন আউটপুট পরিস্থিতির জন্য অনুরূপ ত্রুটি বার্তা উত্পন্ন হবে।
(অবশ্যই তারা ব্রাউজারে অক্ষম কুকিজ বা এমনকি প্রক্সি সমস্যাগুলি দ্বারা প্রভাবিত হচ্ছে The সেশন কার্যকারিতা স্পষ্টভাবে ফ্রি ডিস্কের স্থান এবং অন্যান্য php.ini সেটিংস ইত্যাদির উপরও নির্ভর করে)
আরও লিঙ্ক