পিএইচপিতে "শিরোনাম ইতিমধ্যে প্রেরিত" ত্রুটিটি কীভাবে ঠিক করবেন


831

আমার স্ক্রিপ্টটি চালানোর সময় আমি বেশ কয়েকটি ত্রুটি পেয়ে যাচ্ছি:

সতর্কতা: শিরোনাম তথ্য পরিবর্তন করতে পারে না - হেডার ইতিমধ্যে 23 লাইনে /some/file.php এ /some/file.php এ পাঠানো ( আউটপুট /some/file.php:12 এ শুরু হয়েছে ) প্রেরিত হয়েছে

ত্রুটি বার্তাগুলিতে উল্লিখিত রেখাগুলিতে header()এবং setcookie()কলগুলি রয়েছে।

এর কারণ কী হতে পারে? এবং কিভাবে এটি ঠিক করবেন?



কোনও পাঠ্য আউটপুট না হয়েছে তা নিশ্চিত করুন ( ob_startএবং ob_end_clean() এখানে দরকারী প্রমাণিত হতে পারে)। এরপরে আপনি একটি কুকি বা সেশন সমান সেট করতে পারেন ob_get_contents()এবং তারপরে ob_end_clean()বাফার সাফ করার জন্য ব্যবহার করতে পারেন ।
জ্যাক টাক

safeRedirectআমার পিএইচপি লাইব্রেরিতে ফাংশনটি ব্যবহার করুন : github.com/heinkasner/PHP-Library/blob/master/extra.php
হিঙ্কাসনার

5
~~~~~~~~~~ তোমার এনকোডিং টি ফাইল হওয়া উচিত না UTF-8, কিন্তু UTF-8 (Without BOM)~~~~~~~~~~~
T.Todua

উত্তর:


2994

শিরোনাম পাঠানোর আগে কোনও আউটপুট নেই!

যে কোনও ফাংশন 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 । সেখানেই আপনাকে অকালীন আউটপুট সন্ধান করতে হবে।

সাধারণ কারণ:

  1. প্রিন্ট, প্রতিধ্বনি

    ইচ্ছাকৃত আউটপুট printএবং echoবিবৃতিগুলি এইচটিটিপি শিরোনাম প্রেরণের সুযোগকে সমাপ্ত করবে। অ্যাপ্লিকেশন প্রবাহটি এড়াতে অবশ্যই পুনর্গঠন করতে হবে। ফাংশন এবং টেম্প্লেটিং প্রকল্পগুলি ব্যবহার করুন । বার্তা লিখিত header()হওয়ার আগেই কলগুলি ঘটেছিল তা নিশ্চিত করুন ।

    আউটপুট উত্পাদন করে এমন কার্যাদি অন্তর্ভুক্ত

    • print, echo, printf,vprintf
    • trigger_error, ob_flush, ob_end_flush, var_dump,print_r
    • readfile, passthru, flush, imagepng,imagejpeg


    অন্যদের মধ্যে এবং ব্যবহারকারীর দ্বারা সংজ্ঞায়িত ফাংশন।

  2. কাঁচা এইচটিএমএল অঞ্চল

    কোনও .phpফাইলের আনপারসড এইচটিএমএল বিভাগগুলি হ'ল সরাসরি আউটপুট। স্ক্রিপ্ট শর্তাদি যে কোনও header()কলকে ট্রিগার করবে তা কোনও কাঁচা <html>ব্লকের আগে অবশ্যই লক্ষ করা উচিত ।

    <!DOCTYPE html>
    <?php
        // Too late for headers already.

    আউটপুট যুক্তি থেকে প্রক্রিয়াজাতকরণ পৃথক করতে একটি টেম্প্লেটিং স্কিম ব্যবহার করুন।

    • স্ক্রিপ্টগুলির উপরে ফর্ম প্রসেসিং কোড রাখুন।
    • বার্তা স্থগিত করতে অস্থায়ী স্ট্রিং ভেরিয়েবলগুলি ব্যবহার করুন।
    • প্রকৃত আউটপুট যুক্তি এবং অন্তর্নির্মিত এইচটিএমএল আউটপুট শেষ অনুসরণ করা উচিত।

  3. <?php"স্ক্রিপ্ট.এফপি লাইন 1 " সতর্কতাগুলির জন্য হোয়াইটস্পেসের আগে

    যদি সতর্কতাটি আউটপুটটিকে লাইনে বোঝায় 1, তবে এটি খোলার টোকেনের আগে বেশিরভাগ ক্ষেত্রেই হোয়াইটস্পেস , পাঠ্য বা এইচটিএমএল শীর্ষস্থানীয় <?php

     <?php
    # There's a SINGLE space/newline before <? - Which already seals it.

    একইভাবে এটি সংযুক্ত স্ক্রিপ্ট বা স্ক্রিপ্ট বিভাগগুলির জন্য ঘটতে পারে:

    ?>
    
    <?php

    পিএইচপি প্রকৃতপক্ষে নিকটবর্তী ট্যাগগুলির পরে একটি একক লাইনব্রেক খায় । তবে এটি এমন শূন্যস্থানগুলিতে স্থানান্তরিত একাধিক নিউলাইন বা ট্যাব বা স্থানগুলিকে ক্ষতিপূরণ দেবে না।

  4. ইউটিএফ -8 বিওএম

    একাই লাইন ব্রেক এবং স্পেসগুলি সমস্যা হতে পারে। তবে "অদৃশ্য" চরিত্রের ক্রমগুলিও এটির কারণ হতে পারে। সর্বাধিক বিখ্যাত ইউটিএফ -8 বিওএম (বাইট-অর্ডার-মার্ক) যা বেশিরভাগ পাঠ্য সম্পাদক দ্বারা প্রদর্শিত হয় না। এটি বাইট সিকোয়েন্স EF BB BF, যা ইউটিএফ -8 এনকোডযুক্ত নথিগুলির জন্য alচ্ছিক এবং রিডানডেন্ট ant পিএইচপি যদিও এটি কাঁচা আউটপুট হিসাবে বিবেচনা করতে হবে। এটি আউটপুটে অক্ষর হিসাবে প্রদর্শিত হতে পারে (যদি ক্লায়েন্ট নথিটি ল্যাটিন -১ হিসাবে ব্যাখ্যা করে) বা অনুরূপ "আবর্জনা"।

    বিশেষভাবে গ্রাফিকাল সম্পাদক এবং জাভা ভিত্তিক আইডিই এর উপস্থিতি থেকে গাফেল থাকে। তারা এটি কল্পনা করে না (ইউনিকোড স্ট্যান্ডার্ড দ্বারা বাধ্য) বেশিরভাগ প্রোগ্রামার এবং কনসোল সম্পাদকরা তা করেন:

    জোস সম্পাদক ইউটিএফ -8 বিওএম স্থানধারক এবং এমসির সম্পাদককে একটি বিন্দু দেখাচ্ছে

    সমস্যাটি প্রাথমিকভাবে সনাক্ত করা সহজ। অন্য সম্পাদকদের একটি ফাইল / সেটিংস মেনুতে তার উপস্থিতি চিহ্নিত (নোটপ্যাড ++, Windows এ শনাক্ত ও করতে পারে সমস্যা প্রতিকার BOMs উপস্থিতি একটি অবলম্বন করা হয় পরিদর্শন আরেকটি বিকল্প), hexeditor । * নিক্স সিস্টেমে hexdumpসাধারণত উপলব্ধ থাকে, যদি না গ্রাফিকাল ভেরিয়েন্ট যা এই এবং অন্যান্য সমস্যার নিরীক্ষণকে সহজতর করে:

    বিভ হেক্সিডেটার utf-8 বোম দেখাচ্ছে

    একটি সহজ সমাধান হ'ল "ইউটিএফ -8 (কোনও বিওএম নেই)" বা অনুরূপ নামকরণ হিসাবে ফাইল সংরক্ষণের জন্য পাঠ্য সম্পাদককে সেট করা। প্রায়শই নতুন আগতরা অন্যথায় নতুন ফাইল তৈরি করে এবং পূর্ববর্তী কোডটি অনুলিপি করে পেস্ট করে।

    সংশোধন ইউটিলিটিস

    পাঠ্য ফাইল ( sed/awk অথবা recode) পুনরায় লেখার জন্য আবার স্বয়ংক্রিয় সরঞ্জাম রয়েছে । পিএইচপি জন্য বিশেষত phptagsট্যাগ পরিদর্শন আছে । এটি দীর্ঘ এবং সংক্ষিপ্ত ফর্মগুলিতে ঘনিষ্ঠ এবং খোলার ট্যাগগুলিকে আবারও লিখেছেন, তবে খুব সহজেই নেতৃস্থানীয় এবং অনুসরণযোগ্য শ্বেত স্থান, ইউনিকোড এবং ইউটিএফ-এক্স বিওএম সমস্যাগুলি সমাধান করে:

    phptags  --whitespace  *.php

    এটি সম্পূর্ণ অন্তর্ভুক্ত বা প্রকল্প ডিরেক্টরিতে ব্যবহার করা বুদ্ধিমান।

  5. হোয়াইটস্পেস পরে ?>

    যদি ত্রুটির উত্সটি বন্ধের?> পিছনে হিসাবে উল্লেখ করা থাকে তবে এটি হ'ল এখানে কিছু সাদা জায়গা বা কাঁচা লেখা লেখা হয়েছে। পিএইচপি সমাপ্তি চিহ্নিতকারী এই মুহুর্তে স্ক্রিপ্টের সম্পাদন বন্ধ করে দেয় না। এটির পরে যে কোনও পাঠ্য / স্থানের অক্ষরগুলি পৃষ্ঠার সামগ্রী হিসাবে লেখা হবে।

    এটি সাধারণত পরামর্শ দেওয়া হয়, বিশেষত আগতদের কাছে, ?>পিএইচপি-র নিকটবর্তী ট্যাগগুলি বাদ দেওয়া উচিত। এই eschews এইসব ক্ষেত্রে একটি ছোট অংশ। (বেশিরভাগ include()dস্ক্রিপ্টগুলিই অপরাধী))

  6. ত্রুটির উত্স "0 লাইনে অজানা" হিসাবে উল্লেখ করা হয়েছে

    এটি কোনও পিএইচপি এক্সটেনশান বা php.ini সেটিংস যদি কোনও ত্রুটি উত্সকে সংহত না করা হয়।

    • এটি মাঝেমধ্যে gzipস্ট্রিম এনকোডিং সেটিংস বাob_gzhandler
    • তবে এটি কোনও দ্বিগুণ লোড হওয়া extension=মডিউলও হতে পারে যা অন্তর্নিহিত পিএইচপি স্টার্টআপ / সতর্কতা বার্তা উত্পন্ন করে।

  7. পূর্ববর্তী ত্রুটি বার্তা

    যদি অন্য কোনও পিএইচপি বিবৃতি বা অভিব্যক্তি কোনও সতর্কতা বার্তা বা নোটিশ মুদ্রিত হওয়ার কারণ হয়ে থাকে তবে তা অকালীন আউটপুট হিসাবেও গণনা করা হয়।

    এই ক্ষেত্রে আপনাকে ত্রুটিটি রোধ করতে হবে, বিবৃতি কার্যকর করতে বিলম্ব করতে হবে বা বার্তাটি দমন করতে হবে উদাহরণস্বরূপ 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()ব্যর্থতার ক্ষেত্রে কোনও ব্যবহারকারী বার্তা মুদ্রণ করে ।

কাজের হিসাবে আউটপুট বাফারিং

পিএইচপি গুলি আউটপুট বাফারিং এই সমস্যাটি হ্রাস করার জন্য এক কার্যকরী কাজ। এটি প্রায়শই নির্ভরযোগ্যভাবে কাজ করে, তবে সঠিক অ্যাপ্লিকেশন কাঠামোগতকরণ এবং নিয়ন্ত্রণ যুক্তি থেকে আউটপুট পৃথক করার বিকল্প হওয়া উচিত নয়। এর আসল উদ্দেশ্যটি হ'ল ওয়েব সার্ভারে স্থানান্তর হ্রাস করা।

  1. output_buffering= সেটিং তবুও সাহায্য করতে পারেন। আধুনিক এফপিএম / ফাস্টসিজিআই সেটআপগুলিতে এটি php.ini বা .htaccess বা এমনকি .user.ini এর মাধ্যমে কনফিগার করুন।
    এটি সক্ষম করে পিএইচপিটিকে তাত্ক্ষণিকভাবে ওয়েব সার্ভারে পাস করার পরিবর্তে আউটপুটটিকে বাফার করার অনুমতি দেবে। পিএইচপি এইভাবে এইচটিটিপি শিরোনামকে একত্রিত করতে পারে।

  2. এটি অনুরূপভাবে 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 সেটিংস ইত্যাদির উপরও নির্ভর করে)

আরও লিঙ্ক


এছাড়াও নিয়মিত নোটপ্যাড.এক্সপি কৌশলপূর্ণ। আমি নেটবিয়ানগুলি সাধারণত ব্যবহার করি যা বিওএম যোগ করে না, এমনকি ফাইলটি এনকোড করা থাকলেও। নোটপ্যাডের পরে কোনও ফাইল সম্পাদনা করা বিষয়গুলিকে মিস করে, বিশেষত আইআইএসের দিকে ওয়েবসারভার হিসাবে। দেখে মনে হচ্ছে অ্যাপাচি (একাত্মকভাবে যুক্ত) বিওএম ছাড়ছে।
টেসন

4
?>পিএইচপি ফাইলগুলির শেষে থেকে বন্ধটি সরিয়ে ফেলা সাধারণত একটি ভাল অনুশীলন যা এই ত্রুটিগুলিও হ্রাস করতে সহায়তা করে। ফাইলগুলির শেষে অযাচিত হোয়াইটস্পেস হবে না এবং আপনি পরে প্রতিক্রিয়াটিতে শিরোনাম যুক্ত করতে সক্ষম হবেন। আপনি যদি আউটপুট বাফারিং ব্যবহার করেন তবে এটিও সহজ, এবং অন্তর্ভুক্ত ফাইলগুলির দ্বারা উত্পন্ন অংশগুলির শেষে যুক্ত অযাচিত সাদা স্থান দেখতে পছন্দ করবেন না।
নিকিতা 웃

আশ্চর্যের বিষয়, আমি আমার ফাইলটি সিপ্যানেল লিনাক্স হোস্টিং থেকে ভিপিএসে স্থানান্তরিত করেছি। এটি সঠিকভাবে কাজ করার আগে কিন্তু এখানে এটি এই ত্রুটিটি দেখিয়েছিল ((শিরোনামের আগে আমার কিছু HTML কোড ছিল)। কেন?
পাবলো এসকরবার

@ পুরোশতম্রওয়াত আপনি " তবে এটি অন্য সার্ভারে কাজ করেছিল? "
মারিও

1
@ পিটারসএমসিআইন্টির ইউটিএফ 8 বিওএম সম্ভবতঃ (এটি ঠিক করুন) / কোনও আউটপুট বাফারিং সক্ষম নয় (এটির উপর নির্ভর করবেন না)।
মারিও

199

আপনি HTTP শিরোনাম ( বা এর সাথে ) প্রেরণের আগে যখন কিছু প্রেরণ করা হয় তখন এই ত্রুটি বার্তাটি ট্রিগার হয়ে যায় । HTTP শিরোনামগুলির আগে কিছু আউটপুট দেওয়ার সাধারণ কারণগুলি:setcookieheader

  • দুর্ঘটনাজনক শ্বেতস্থান, প্রায়শই ফাইলগুলির শুরু বা শেষে, এর মতো:

     <?php
    // Note the space before "<?php"
    ?>

       এটি এড়াতে, কেবল বন্ধটি ছেড়ে দিন ?>- এটি কোনওভাবেই প্রয়োজন হয় না।

  • পিএইচপি ফাইলের শুরুতে বাইট অর্ডার চিহ্নগুলি । আপনার পিএইচপি ফাইলগুলি হ্যাক্স সম্পাদকের সাথে পরীক্ষা করে দেখুন এটি কেস কিনা। তারা বাইট দিয়ে শুরু করা উচিত 3F 3C। আপনি নিরাপদে বিওএম অপসারণ করতে পারেনEF BB BF ফাইলগুলির শুরু থেকে ।
  • যেমন রিং স্পষ্ট আউটপুট, এর echo, printf, readfile, passthru, কোড সামনে<? ইত্যাদি
  • display_errorsPhp.ini সম্পত্তি সেট করা থাকলে পিএইচপি দ্বারা একটি সতর্কবার্তা আউটপুট করা হয় । প্রোগ্রামার ভুলতে ক্রাশ হওয়ার পরিবর্তে পিএইচপি নিঃশব্দে ত্রুটিটি সংশোধন করে এবং একটি সতর্কতা প্রকাশ করে। আপনি যখন ত্রুটিdisplay_errors বা ত্রুটি_বিন্যাস কনফিগারেশনগুলি সংশোধন করতে পারেন তবে আপনার সমস্যাটি ঠিক করা উচিত।
    সাধারণ কারণগুলি হ'ল অ্যারের অপরিজ্ঞাত উপাদানগুলিতে অ্যাক্সেস (যেমন $_POST['input']ব্যবহার না করা emptyবা issetইনপুট সেট রয়েছে কিনা তা পরীক্ষা না করা), বা স্ট্রিং আক্ষরিকের পরিবর্তে একটি অপরিজ্ঞাত ধ্রুবক ব্যবহার করা (যেমন $_POST[input]অনুপস্থিত উদ্ধৃতিগুলি নোট করুন)।

আউটপুট বাফারিং চালু করার ফলে সমস্যাটি দূরে যেতে হবে; কল করার পরে সমস্ত আউটপুট ob_startমেমরিতে বাফার হয় যতক্ষণ না আপনি বাফারটি প্রকাশ করেন, যেমন সহ ob_end_flush

তবে, আউটপুট বাফারিংগুলি সমস্যাগুলি এড়ানো চলাকালীন, আপনার অ্যাপ্লিকেশনটি HTTP শিরোনামের আগে কোনও HTTP বডি কেন আউটপুট করে তা সত্যই নির্ধারণ করা উচিত। এটি ফোন কল নেওয়ার এবং কলকারকে বলার আগে যে সে ভুল নম্বর পেয়েছে তা বলার আগে আপনার দিন এবং আবহাওয়া নিয়ে আলোচনা করার মতো হবে।


এটি আমাকে ধন্যবাদ ধন্যবাদ
বিশ্ব প্রতাপ

122

আমি এই ত্রুটিটি এর আগেও বহুবার পেয়েছি এবং আমি নিশ্চিত যে সমস্ত পিএইচপি প্রোগ্রামার কমপক্ষে একবার এই ত্রুটিটি পেয়েছিল।

সম্ভাব্য সমাধান 1

ফাইলটি শুরুর আগে বা ফাইল শেষ হওয়ার পরে ফাঁকা ফাঁকা জায়গাগুলির কারণে এই ত্রুটি ঘটেছে se এই ফাঁকা স্থানগুলি এখানে হওয়া উচিত নয়।

প্রাক্তন) এখানে কোনও ব্ল্যাক স্পেস নেই O

   echo "your code here";

?>
THERE SHOULD BE NO BLANK SPACES HERE

ফাইলের সাথে যুক্ত সমস্ত ফাইল যা এই ত্রুটির কারণ হয়ে থাকে তা পরীক্ষা করুন।

দ্রষ্টব্য: কখনও কখনও EDITOR (IDE) যেমন gedit (একটি ডিফল্ট লিনাক্স সম্পাদক) সেভ ফাইলটিতে একটি ফাঁকা লাইন যুক্ত করে। এটি হওয়া উচিত নয়। আপনি যদি লিনাক্স ব্যবহার করেন। আপনি পৃষ্ঠার শেষে স্পেস / লাইনগুলি পরে>> সরানোর জন্য ষষ্ঠ সম্পাদক ব্যবহার করতে পারেন?

সম্ভাব্য সমাধান 2: যদি এটি আপনার ক্ষেত্রে না হয় তবে আউটপুট বাফারিংয়ে ob_start ব্যবহার করুন :

<?php
  ob_start();

  // code 

 ob_end_flush();
?> 

এটি আউটপুট বাফারিং চালু করবে এবং পৃষ্ঠা বাফার হওয়ার পরে আপনার শিরোনাম তৈরি হবে।


18
ob_start()শুধু সমস্যা লুকায়; এই বিশেষ সমস্যা সমাধানের জন্য এটি ব্যবহার করবেন না।
জ্যাক

@ জ্যাক যদি আমি এটি ব্যবহার না করি ob_start(), তবে এই সমস্যাটি সমাধান করার জন্য আমার কী করা উচিত:Headers already sent
শাফিজাদেহ

@ সাজাদ যদি আপনি বিশেষত যে সম্পাদকটির ব্যবহার করছেন তার কারণে আপনি ত্রুটিটি পেয়ে থাকেন তবে সমস্যাগুলির কারণ বন্ধ করতে এটি সম্পাদনাগুলি করা উচিত, বা সম্পাদকদের পরিবর্তন করা উচিত। যদি আপনি অন্য কোনও কারণে ত্রুটি পেয়ে থাকেন তবে সমস্যাটি আসলে কী তা নির্ধারণ করার জন্য এবং এই সমস্যার সমাধানের জন্য আপনার এই প্রশ্নের উত্তরগুলি (বিশেষত স্বীকৃত উত্তর) পড়ে নেওয়া উচিত।
স্যামস্কাঞ্চ

3
ob_start()সমস্যাটিকে "আড়াল" করে না , এটি সমস্যার সমাধান করে।
টিএমএস

1
আমার ফাইলগুলি সার্ভারে আপলোড করার সময় আমার এমন সমস্যা হয়েছিল যা এমনকি পিএইচপি 5.3 সমর্থন করে যা পিএইচপি 5.6 বা তারও বেশি সহ সার্ভারটি ব্যবহার করে
জিজি সোফট

86

নীচের লাইনের পরিবর্তে

//header("Location:".ADMIN_URL."/index.php");

লেখার

echo("<script>location.href = '".ADMIN_URL."/index.php?msg=$msg';</script>");

অথবা

?><script><?php echo("location.href = '".ADMIN_URL."/index.php?msg=$msg';");?></script><?php

এটি অবশ্যই আপনার সমস্যার সমাধান করবে। আমি একই সমস্যার মুখোমুখি হয়েছি তবে উপরের উপায়ে হেডার লোকেশন লেখার মাধ্যমে সমাধান করেছি।


41

তুমি কর

printf ("Hi %s,</br />", $name);

কুকিজ সেট করার আগে যা অনুমোদিত নয়। আপনি শিরোনামের আগে কোনও আউটপুট প্রেরণ করতে পারবেন না, একটি ফাঁকা লাইনও নয়।


32

এটি এই লাইনের কারণে:

printf ("Hi %s,</br />", $name);

শিরোনামগুলি প্রেরণের আগে আপনার কোনও কিছু মুদ্রণ / প্রতিধ্বন করা উচিত নয় ।


31

সাধারন সমস্যা:

( উত্স থেকে অনুলিপি করা )

====================

1) কমান্ডের echo..আগে কোনও আউটপুট (যেমন বা এইচটিএমএল কোড) থাকা উচিত নয় header(.......);

2) ট্যাগগুলির আগে এবং পরে কোনও সাদা-স্থান (বা নিউলাইন ) সরিয়ে ফেলুন ।<?php?>

3) স্বর্ণের বিধি! - এই পিএইচপি ফাইলটি (এবং এছাড়াও, আপনি includeঅন্যান্য ফাইলগুলিও) বিওএম এনকোডিং ছাড়াই UTF8 রয়েছে (এবং কেবল ইউটিএফ -8 নয় ) তা পরীক্ষা করে দেখুন। এটি অনেক ক্ষেত্রে সমস্যা (কারণ ইউটিএফ 8) এনকোডযুক্ত ফাইলের পিএইচপি ফাইলের শুরুতে একটি বিশেষ চরিত্র রয়েছে, যা আপনার পাঠ্য-সম্পাদকটি দেখায় না) !!!!!!!!!!!

4) পর header(...);আপনি ব্যবহার করা আবশ্যকexit;

5) সর্বদা 301 বা 302 রেফারেন্স ব্যবহার করুন:

header("location: http://example.com",  true,  301 );  exit;

6) ত্রুটি প্রতিবেদন চালু করুন, এবং ত্রুটিটি সন্ধান করুন। আপনার ত্রুটি কোনও ফাংশন যা কাজ করছে না বলে হতে পারে। আপনি যখন ত্রুটি প্রতিবেদন চালু করেন, আপনার সর্বদা শীর্ষস্থানীয় ত্রুটিটি ঠিক করা উচিত। উদাহরণস্বরূপ, এটি হতে পারে "সতর্কতা: তারিখ_দেফফল_টাইমজোন_জেট (): সিস্টেমের টাইমজোন সেটিংসের উপর নির্ভর করা নিরাপদ নয়" " - তারপরে আরও নীচে আপনি "শিরোনামগুলি প্রেরণ করা হয়নি" ত্রুটি দেখতে পাবেন। সর্বাধিক সর্বাধিক (1 ম) ত্রুটি ঠিক করার পরে, আপনার পৃষ্ঠাটি আবার লোড করুন। যদি আপনার এখনও ত্রুটি থাকে তবে আবার শীর্ষস্থানীয় ত্রুটিটি ঠিক করুন।

)) উপরের কোনওটি যদি সহায়তা না করে তবে জাএভিএসসিআরটিটি পুনর্নির্দেশটি ব্যবহার করুন (তবে দৃ strongly়ভাবে অ-প্রস্তাবিত পদ্ধতি) কাস্টম ক্ষেত্রে সর্বশেষ সুযোগ হতে পারে ...:

echo "<script type='text/javascript'>window.top.location='http://website.com/';</script>"; exit;

কেন স্পষ্টভাবে সেট 301বা 302গুরুত্বপূর্ণ?
জোনিস এলমারিস

26

একটি সহজ টিপ: প্রথম <?phpলিগের ঠিক আগে আপনার স্ক্রিপ্টে একটি সাধারণ স্থান (বা অদৃশ্য বিশেষ চর), এটির কারণ হতে পারে! বিশেষত যখন আপনি একটি দলে কাজ করছেন এবং কেউ "দুর্বল" আইডিই ব্যবহার করছেন বা অদ্ভুত পাঠ্য সম্পাদক সহ ফাইলগুলিতে গোলমাল করেছেন।

আমি এই জিনিসগুলি দেখেছি;)


22

অন্য একটি খারাপ অভ্যাস এই সমস্যাটিকে ডেকে আনতে পারে যা এখনও বলা হয়নি।

এই কোড স্নিপেট দেখুন:

<?php
include('a_important_file.php'); //really really really bad practise
header("Location:A location");
?>

জিনিস ঠিক আছে, তাই না?

"A_important_file.php" যদি এটি হয়:

<?php
//some php code 
//another line of php code
//no line above is generating any output
?>

 ----------This is the end of the an_important_file-------------------

এই কাজ করবে না? কেন? কারণ ইতিমধ্যে একটি নতুন লাইন তৈরি হয়েছে।

এখন, যদিও এটি সাধারণ পরিস্থিতি নয় তবে আপনি যদি কোনও এমভিসি ফ্রেমওয়ার্ক ব্যবহার করছেন যা আপনার নিয়ামককে জিনিস হস্তান্তর করার আগে প্রচুর ফাইল লোড করে? এটি কোনও অস্বাভাবিক পরিস্থিতি নয়। এর জন্য প্রস্তুত থাকুন।

থেকে PSR-2 2.2:


  • সমস্ত পিএইচপি ফাইলগুলি অবশ্যই ব্যবহার করে Unix LF (linefeed) line ending
  • সমস্ত পিএইচপি ফাইল একটি দিয়ে শেষ হওয়া আবশ্যক single blank line
  • ক্লোজিং?> ট্যাগ omittedথাকা ফাইল থাকা উচিতonly php

বিশ্বাস করুন, এই মানগুলি অনুসরণ করা আপনাকে আপনার জীবন থেকে কয়েক ঘন্টা নষ্ট করতে পারে :)


2
বেশ কয়েকটি স্ট্যান্ডার্ড অনুসারে (উদাহরণস্বরূপ জেন্ড), আপনার কোনওভাবেই ?>কোনও ফাইলের ক্লোজিং ট্যাগ লাগানো উচিত নয়
ড্যানিয়েল ডব্লিউ

আমি উইন্ডোজ পরিবেশে এটি পুনরুত্পাদন করতে পারি না কারণ এটি কোনও সংমিশ্রণ ব্যবহার করে (ক্লোজিং ট্যাগ, ফাঁকা সংস্থান, এন্টার কী চাপুন ইত্যাদি) কাজ করে। দেখে মনে হচ্ছে এই সমস্যাটি বেশিরভাগ ক্ষেত্রে লিনাক্স পরিবেশে ঘটে।
জুনিয়র মেহে-

@ জুনিয়রম এটি পুনরুত্পাদনযোগ্য হওয়া উচিত। আপনি যে কোডটি পরীক্ষামূলকভাবে টুকরো টুকরো বা অন্য কোনও কিছুতে পরীক্ষামূলকভাবে ভাগ করে নিতে পারেন?
এমডি সাহেব বিন মাহবুব

আমি উইন্ডোজ 7 এ আছি, সর্বশেষ ওয়্যাম্প ইনস্টল করা আছে। আমি মনে করি এই বাগটি লাইনের শেষের জন্য লুকানো অক্ষরের সাথে সম্পর্কিত। আমার ওয়ার্ডপ্রেসের শর্টকোডস.পিএফ সমস্যাটি সৃষ্টি করেছিল। আমি এই ফাইলে একটি সাধারণ ফাংশন যুক্ত করেছি এবং এটি এই "শিরোনাম প্রেরণ করা হয়েছে" ত্রুটিটি সরিয়ে দিতে শুরু করে। আমি আমার শর্টকোডস.এফপিকে ওয়ার্ডপ্রেসের সাথে তুলনা করেছি 'এবং এটি ঠিক আছে CR LF(লাইনের উইন্ডোজ শেষে) except আমি এর LFপরিবর্তে ওয়ার্ডপ্রেস রেপো (লিনাক্সের শেষ প্রান্তে) থাকা আসল ফাইলটি ডাউনলোড করে এটি সমাধান করেছি CR LFএবং আমি আমার ফাংশনটি থিমের ফাংশন.এফপি-তে স্থানান্তরিত করেছি। উপর ভিত্তি করে: bit.ly/1Gh6mzN
জুনিয়র মেহেé

@ সাহিব, লক্ষ্য করুন যে এখনও আমি এই উত্তরে যা বলেছি তা পুনরুত্পাদন করতে পারি না। উত্তরটি লিনাক্স পরিবেশের জন্য সম্পূর্ণ জরিমানা। আমি ?> <?phpএকক ফাঁকা লাইন সরানো এবং যুক্ত করার মাধ্যমে , ক্লোজিং ট্যাগ যুক্ত এবং বাদ দেওয়াতে এর মধ্যে ফাঁকা বিষয়গুলি পরীক্ষা করেছি ?>। উইন্ডোজ + ওয়্যাম্পে এই সমস্ত সমন্বয় সূক্ষ্মভাবে কাজ করে। Wierd ...
জুনিয়র মেহে

15

কখনও কখনও যখন ডেভ প্রক্রিয়াতে উভয় WIN ওয়ার্ক স্টেশন এবং লিনাক্স সিস্টেম (হোস্টিং) থাকে এবং কোডটিতে আপনি সম্পর্কিত লাইনের আগে কোনও আউটপুট দেখতে পান না, এটি ফাইলের বিন্যাস এবং ইউনিক্স এলএফ (লাইনফিড) লাইন সমাপ্তির অভাব হতে পারে ।

এটি দ্রুত সমাধানের জন্য আমরা সাধারণত যা করি, তা ফাইলটির পুনরায় নামকরণ করা হয় এবং লিনাক্স সিস্টেমে নতুন নাম পরিবর্তিত ফাইলের পরিবর্তে একটি নতুন ফাইল তৈরি করা হয় এবং তারপরে সামগ্রীটি অনুলিপি করা হয়। অনেক সময় এটি সমস্যাটি সমাধান করে কারণ ডাব্লুআইএন-এ তৈরি করা কিছু ফাইল একবার হোস্টিংয়ের কারণে এই সমস্যার কারণ হয়ে দাঁড়ায়।

এই ফিক্সটি আমরা FTP দ্বারা পরিচালিত সাইটগুলির জন্য একটি সহজ ফিক্স এবং কখনও কখনও আমাদের নতুন দলের সদস্যদের কিছুটা সময় বাঁচাতে পারি।


2

প্রতিধ্বনিত বা মুদ্রণের পরে যখন হেডার পাঠানো হয় তখন সাধারণত এই ত্রুটি দেখা দেয়। যদি এই ত্রুটিটি কোনও নির্দিষ্ট পৃষ্ঠায় দেখা দেয় তবে নিশ্চিত হয়ে নিন যে ফোন করার আগে পৃষ্ঠাটি কোনও প্রতিধ্বনি করছে নাstart_session()

অপ্রত্যাশিত ত্রুটির উদাহরণ:

 <?php //a white-space before <?php also send for output and arise error
session_start();
session_regenerate_id();

//your page content

আরও একটি উদাহরণ:

<?php
includes 'functions.php';
?> <!-- This new line will also arise error -->
<?php
session_start();
session_regenerate_id();

//your page content

উপসংহার: কল করার আগে session_start()বা কোনও header()ফাংশন এমনকি কোনও সাদা-স্থান বা নতুন-লাইন নয় এমন কোনও অক্ষর আউটপুট করবেন না

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.