PHP में "हेडर्स पहले से भेजे गए" त्रुटि को कैसे ठीक करें


831

अपनी स्क्रिप्ट चलाते समय, मुझे इस तरह की कई त्रुटियाँ मिल रही हैं:

चेतावनी: शीर्ष लेख की सूचना को संशोधित नहीं किया जा सकता है - पहले से ही भेजे गए हेडर ( आउटपुट /some/file.php:12 पर शुरू हो गए ) /some/file.php में लाइन 23 पर

त्रुटि संदेशों में उल्लिखित पंक्तियों में कॉल header()और setcookie()कॉल होते हैं।

इसका क्या कारण रह सकता है? और इसे कैसे ठीक करें?



सुनिश्चित करें कि कोई पाठ आउटपुट नहीं है ( ob_startऔर ob_end_clean() यहां उपयोगी साबित हो सकता है)। फिर आप एक कुकी या सत्र के बराबर सेट कर सकते हैं ob_get_contents()और फिर ob_end_clean()बफर को साफ़ करने के लिए उपयोग कर सकते हैं।
जैक टक

safeRedirectमेरे PHP लाइब्रेरी में फ़ंक्शन का उपयोग करें : github.com/heinkasner/PHP-Library/blob/master/extra.php
heinkasner

5
~~~~~~~~~~~ आपकी फ़ाइल ENCODING नहीं होनी चाहिए UTF-8, लेकिन UTF-8 (Without BOM)~~~~~~~~~~~
T.Todua

जवाबों:


2995

हेडर भेजने से पहले कोई आउटपुट नहीं!

किसी भी आउटपुट के आने से पहले HTTP हेडर भेजने / संशोधित करने वाले कार्य किए जाने चाहिएsummary ⇊ अन्यथा कॉल विफल:

चेतावनी: शीर्ष लेख की सूचना को संशोधित नहीं किया जा सकता - हेडर पहले से ही भेजा गया (आउटपुट स्क्रिप्ट पर शुरू हुआ : पंक्ति )

HTTP हेडर को संशोधित करने वाले कुछ कार्य हैं:

आउटपुट हो सकता है:

  • अनजाने में:

  • जानबूझकर:

    • print, echoऔर अन्य उत्पादन उत्पादन कार्य करता है
    • कच्चा <html>अनुभाग पूर्व <?phpकोड।

क्यों होता है?

यह समझने के लिए कि आउटपुट से पहले हेडर क्यों भेजा जाना चाहिए, यह एक विशिष्ट HTTP प्रतिक्रिया को देखने के लिए आवश्यक है । PHP स्क्रिप्ट मुख्य रूप से HTML सामग्री उत्पन्न करती है, लेकिन वेबसर्वर के लिए HTTP / CGI हेडर का एक सेट भी पास करती है:

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>

पेज / आउटपुट हमेशा हेडर का अनुसरण करता है। PHP को सबसे पहले वेबसर्वर को हेडर पास करना होता है। यह केवल एक बार ही कर सकता है। डबल लाइनब्रेक के बाद यह कभी भी उन्हें संशोधित नहीं कर सकता है।

जब पीएचपी पहले उत्पादन प्राप्त करता है ( print, echo, <html>) यह होगा फ्लश सभी एकत्र हेडर। बाद में यह सभी आउटपुट भेज सकता है। लेकिन इसके बाद HTTP हेडर भेजना असंभव है।

आप यह कैसे पता लगा सकते हैं कि समय से पहले उत्पादन कैसे हुआ?

header()चेतावनी समस्या कारण का पता लगाने के लिए सभी प्रासंगिक जानकारी होती है:

चेतावनी: शीर्ष लेख की सूचना को संशोधित नहीं किया जा सकता - हेडर पहले से ही भेजे गए (आउटपुट / www / usr2345 / htdocs / schem.php पर शुरू हुआ ) : 52 / / /r2345/htdocs/index.php पर लाइन 100 पर

यहां "लाइन 100" उस स्क्रिप्ट को संदर्भित करता है जहां header() मंगलाचरण विफल रहा।

कोष्ठक के भीतर " आउटपुट शुरू " नोट अधिक महत्वपूर्ण है। यह पिछले आउटपुट के स्रोत को दर्शाता है। इस उदाहरण में यह auth.php और लाइन है52 । यहीं आपको समय से पहले आउटपुट के लिए देखना था।

विशिष्ट कारण:

  1. प्रिंट, गूंज

    से प्रासंगिक आउटपुट printऔर echoस्टेटमेंट HTTP हेडर भेजने का अवसर समाप्त कर देंगे। उससे बचने के लिए एप्लिकेशन प्रवाह का पुनर्गठन किया जाना चाहिए। कार्यों और अस्थायी योजनाओं का उपयोग करें । संदेश लिखे जाने से पहले सुनिश्चित करें कि header()कॉल हो ।

    आउटपुट का उत्पादन करने वाले कार्यों में शामिल हैं

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


    दूसरों और उपयोगकर्ता-परिभाषित कार्यों के बीच।

  2. कच्चे HTML क्षेत्रों

    किसी .phpफ़ाइल में अनपर्स किए गए HTML सेक्शन भी सीधे आउटपुट होते हैं। किसी भी कच्चे ब्लॉक header()से पहले कॉल को ट्रिगर करने वाली स्क्रिप्ट शर्तों को नोट किया जाना चाहिए ।<html>

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

    आउटपुट लॉजिक से प्रसंस्करण को अलग करने के लिए एक अस्थायी योजना का उपयोग करें।

    • स्क्रिप्ट कोड के रूप में जगह प्रसंस्करण कोड।
    • संदेशों को स्थगित करने के लिए अस्थायी स्ट्रिंग चर का उपयोग करें।
    • वास्तविक आउटपुट लॉजिक और इंटरमिक्स किए गए HTML आउटपुट को अंतिम अनुसरण करना चाहिए।

  3. <?php"Script.php लाइन 1 " चेतावनी के लिए पहले व्हाट्सएप

    यदि चेतावनी लाइन में आउटपुट को संदर्भित करती है 1, तो यह शुरुआती टोकन से पहले ज्यादातर व्हाट्सएप , टेक्स्ट या HTML का नेतृत्व कर रहा है <?php

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

    इसी तरह यह संलग्न लिपियों या स्क्रिप्ट अनुभागों के लिए हो सकता है:

    ?>
    
    <?php

    PHP वास्तव में करीबी टैग के बाद एक ही लाइनब्रेक खाती है । लेकिन यह इस तरह के अंतराल में स्थानांतरित कई नए समाचार या टैब या रिक्त स्थान की भरपाई नहीं करेगा।

  4. UTF-8 BOM

    अकेले लाइनब्रेक और रिक्त स्थान एक समस्या हो सकती है। लेकिन "अदृश्य" चरित्र अनुक्रम भी हैं जो इसका कारण बन सकते हैं। सबसे प्रसिद्ध UTF-8 BOM (बाइट-ऑर्डर-मार्क) जो अधिकांश टेक्स्ट संपादकों द्वारा प्रदर्शित नहीं किया जाता है। यह बाइट अनुक्रम है EF BB BF, जो UTF-8 एन्कोडेड दस्तावेज़ों के लिए वैकल्पिक और निरर्थक है। PHP को हालांकि इसे कच्चा आउटपुट माना जाता है। यह आउटपुट में पात्रों के रूप में दिखाई दे सकता है (यदि क्लाइंट दस्तावेज़ को लैटिन -1 के रूप में व्याख्या करता है) या इसी तरह के "कचरा" के रूप में।

    विशेष रूप से चित्रमय संपादकों और जावा आधारित IDE इसकी उपस्थिति से बेखबर हैं। वे इसकी कल्पना नहीं करते (यूनिकोड मानक द्वारा बाध्य)। अधिकांश प्रोग्रामर और कंसोल एडिटर हालांकि करते हैं:

    joes संपादक UTF-8 BOM प्लेसहोल्डर दिखा रहा है, और MC संपादक एक डॉट

    समस्या को जल्दी पहचानना आसान है। अन्य संपादकों एक फ़ाइल / सेटिंग्स मेनू में अपनी उपस्थिति की पहचान (Notepad ++ विंडोज पर पहचान करने और कर सकते हैं हो सकता है समस्या का समाधान BOMs उपस्थिति एक का सहारा है निरीक्षण करने के लिए एक अन्य विकल्प), hexeditor । पर * निक्स सिस्टम hexdumpआमतौर पर उपलब्ध होता है, यदि ग्राफिकल वैरिएंट नहीं है जो इन और अन्य मुद्दों की ऑडिटिंग को सरल बनाता है:

    utv-8 बम दिखाते हुए बीवी

    फ़ाइलों को "UTF-8 (कोई BOM)" या इस तरह के नामकरण के रूप में सहेजने के लिए पाठ संपादक को सेट करने के लिए एक आसान निर्धारण है। अक्सर नए लोग नई फाइल बनाने का सहारा लेते हैं और पिछले कोड को वापस कॉपी करके चिपका देते हैं।

    सुधार उपयोगिताओं

    टेक्स्ट फ़ाइलों ( sed/awk या recode) को जांचने और फिर से लिखने के लिए स्वचालित उपकरण भी हैं । PHP के लिए विशेष रूप से वहाँ phptagsटैग tidier है । यह लंबे और छोटे रूपों में नज़दीकी और खुले टैग्स को फिर से लिखता है, लेकिन व्हाट्सएप, यूनिकोड और यूटीएफ-एक्स बीओएम मुद्दों को आसानी से ले जाता है।

    phptags  --whitespace  *.php

    यह पूरी तरह से शामिल या परियोजना निर्देशिका पर उपयोग करने के लिए समझदार है।

  5. व्हाट्सएप के बाद ?>

    यदि समापन के?> पीछे त्रुटि स्रोत का उल्लेख किया गया है, तो यह वह जगह है जहां कुछ व्हाट्सएप या कच्चे पाठ को लिखा गया है। PHP अंत मार्कर इस बिंदु पर स्क्रिप्ट निष्पादन को समाप्त नहीं करता है। किसी भी पाठ / अंतरिक्ष वर्ण के बाद इसे पृष्ठ सामग्री के रूप में लिखा जाएगा।

    यह आमतौर पर सलाह दी जाती है, विशेष रूप से नए लोगों के लिए, कि अनुगामी ?>PHP क्लोज टैग को छोड़ दिया जाना चाहिए। इससे इन मामलों का एक छोटा सा हिस्सा बच जाता है। (काफी सामान्य include()dस्क्रिप्ट अपराधी हैं।)

  6. त्रुटि स्रोत "अज्ञात लाइन 0 पर" के रूप में वर्णित

    यह आमतौर पर एक PHP विस्तार या php.ini सेटिंग है यदि कोई त्रुटि स्रोत समवर्ती नहीं है।

    • यह कभी-कभी gzipस्ट्रीम एन्कोडिंग सेटिंग या हैob_gzhandler
    • लेकिन यह कोई भी दोगुना लोडेड extension=मॉड्यूल हो सकता है जो एक अंतर्निहित PHP स्टार्टअप / चेतावनी संदेश उत्पन्न करता है।

  7. पूर्ववर्ती त्रुटि संदेश

    यदि कोई अन्य PHP स्टेटमेंट या एक्सप्रेशन एक चेतावनी संदेश या नोटिस को प्रिंट आउट होने का कारण बनता है, तो वह समय से पहले आउटपुट के रूप में भी गिना जाता है।

    इस मामले में आपको त्रुटि से बचने, कथन के निष्पादन में देरी करने, या उदाहरण के साथ संदेश को दबाने 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()विफलताओं के मामले में एक उपयोगकर्ता संदेश प्रिंट करता है ।

आउटपुट बफ़रिंग को वर्कअराउंड के रूप में

PHPs आउटपुट बफ़रिंग इस समस्या को कम करने के लिए एक समाधान है। यह अक्सर मज़बूती से काम करता है, लेकिन उचित अनुप्रयोग संरचना और नियंत्रण तर्क से आउटपुट को अलग करने के लिए स्थानापन्न नहीं होना चाहिए। इसका वास्तविक उद्देश्य वेबसर्वर के लिए स्थानांतरित स्थान को कम करना है।

  1. output_buffering= सेटिंग फिर भी कर सकते हैं। इसे आधुनिक FPM / FastCGP सेटअप पर php.ini या .htaccess या even .user.ini में कॉन्फ़िगर करें ।
    इसे सक्षम करना PHP को वेबसर्वर पर तुरंत पारित करने के बजाय बफर आउटपुट के लिए अनुमति देगा। PHP इस प्रकार HTTP हेडर एकत्रित कर सकता है।

  2. यह वैसे ही ob_start(); आह्वान स्क्रिप्ट के ऊपर कॉल के साथ संलग्न किया जा सकता है । हालांकि कई कारणों से कम विश्वसनीय है:

    • यहां तक ​​कि अगर <?php ob_start(); ?>पहली स्क्रिप्ट शुरू होती है, तो व्हाट्सएप या बीओएम अप्रभावी होने से पहले ही फेरबदल कर सकता है ।

    • यह HTML आउटपुट के लिए व्हॉट्सएप छुपा सकता है। लेकिन जैसे ही एप्लिकेशन लॉजिक बाइनरी कंटेंट (उदाहरण के लिए एक उत्पन्न हुई छवि) को भेजने का प्रयास करता है, बफ़र किए गए एक्सट्रॉन्स आउटपुट एक समस्या बन जाता है। ( ob_clean() फरारी वर्कअराउंड के रूप में आवश्यक।)

    • बफर आकार में सीमित है, और आसानी से चूक के लिए छोड़ दिया जा सकता है। और यह एक दुर्लभ घटना भी नहीं है, ऐसा होने पर नीचे ट्रैक करना मुश्किल है।

इसलिए दोनों दृष्टिकोण अविश्वसनीय हो सकते हैं - विशेष रूप से जब विकास सेटअप और / या उत्पादन सर्वर के बीच स्विच करते हैं। यही कारण है कि आउटपुट बफ़रिंग को व्यापक रूप से सिर्फ एक बैसाखी / सख्ती से वर्कअराउंड माना जाता है।

मैनुअल में मूल उपयोग उदाहरण भी देखें , और अधिक पेशेवरों और विपक्षों के लिए:

लेकिन यह दूसरे सर्वर पर काम किया !?

यदि आपको पहले हेडर चेतावनी नहीं मिली है, तो आउटपुट बफरिंग php.ini सेटिंग बदल गई है। यह वर्तमान / नए सर्वर पर अपुष्ट होने की संभावना है।

के साथ जाँच कर रहा है headers_sent()

आप हमेशा headers_sent()जांच करने के लिए उपयोग कर सकते हैं कि क्या यह अभी भी संभव है ... हेडर भेजें। जो सशर्त रूप से किसी जानकारी को प्रिंट करने या अन्य कमबैक तर्क को लागू करने के लिए उपयोगी है।

if (headers_sent()) {
    die("Redirect failed. Please click on this link: <a href=...>");
}
else{
    exit(header("Location: /user.php"));
}

उपयोगी कमियां हैं:

  • HTML <meta>टैग

    यदि आपका एप्लिकेशन ठीक करने के लिए संरचनात्मक रूप से कठिन है, तो रीडायरेक्ट करने की अनुमति देने का एक आसान (लेकिन कुछ हद तक लाभहीन) तरीका HTML <meta>टैग को इंजेक्ट कर रहा है । एक पुनर्निर्देशन के साथ प्राप्त किया जा सकता है:

     <meta http-equiv="Location" content="http://example.com/">

    या एक छोटी देरी के साथ:

     <meta http-equiv="Refresh" content="2; url=../target.html">

    यह पिछले <head>अनुभाग में उपयोग किए जाने पर गैर-वैध HTML की ओर जाता है । अधिकांश ब्राउज़र अभी भी इसे स्वीकार करते हैं।

  • जावास्क्रिप्ट पुनर्निर्देशित

    विकल्प के रूप में जावास्क्रिप्ट पुनर्निर्देशन का उपयोग पृष्ठ पुनर्निर्देश के लिए किया जा सकता है:

     <script> location.replace("target.html"); </script>

    जबकि यह अक्सर <meta>वर्कअराउंड की तुलना में अधिक HTML अनुरूप है , यह जावास्क्रिप्ट-सक्षम ग्राहकों पर निर्भरता को बढ़ाता है।

हालाँकि वास्तविक HTTP शीर्ष लेख () कॉल विफल होने पर दोनों दृष्टिकोण स्वीकार्य कमियां बनाते हैं। आदर्श रूप से आप इसे हमेशा अंतिम विकल्प के रूप में उपयोगकर्ता के अनुकूल संदेश और क्लिक करने योग्य लिंक के साथ जोड़ेंगे। (उदाहरण के लिए जो http_redirect () PECL एक्सटेंशन करता है।)

क्यों setcookie()और session_start()कैसे प्रभावित होते हैं

दोनों setcookie()और session_start()एक Set-Cookie:HTTP हेडर भेजने की जरूरत है । इसलिए वही स्थितियाँ लागू होती हैं, और समयपूर्व आउटपुट स्थितियों के लिए समान त्रुटि संदेश उत्पन्न होंगे।

(बेशक वे ब्राउज़र में अक्षम कुकीज़ से प्रभावित होते हैं, या यहां तक ​​कि प्रॉक्सी के मुद्दे। सत्र की कार्यक्षमता स्पष्ट रूप से मुक्त डिस्क स्थान और अन्य php.ini सेटिंग्स, आदि पर भी निर्भर करती है)

आगे के लिंक


इसके अलावा नियमित नोटपैड। मुश्किल है। मैं सामान्य रूप से नेटबीन्स का उपयोग करता हूं जो बीओएम को नहीं जोड़ता है, भले ही फ़ाइल एन्कोडेड हो। नोटपैड में बाद में किसी फाइल को एडिट करने से चीजें गड़बड़ हो जाती हैं, खासकर वेबसर्वर के रूप में आईआईएस की ओर। ऐसा लगता है कि अपाचे डिस्कॉम (इकाई जोड़ा गया) बीओएम है।
टेसन

4
?>एक php फ़ाइलों के अंत से समापन को हटाने आमतौर पर एक अच्छा अभ्यास है जो इन त्रुटियों को कम करने में मदद करता है। अवांछित व्हाट्सएप फ़ाइलों के अंत में नहीं होगा, और आप अभी भी बाद में प्रतिक्रिया में हेडर जोड़ पाएंगे। यदि आप आउटपुट बफ़रिंग का उपयोग करते हैं, तो यह भी आसान है, और शामिल फ़ाइलों द्वारा उत्पन्न भागों के अंत में जोड़ा अवांछित व्हाट्सएप देखना पसंद नहीं करेंगे।
निकिता Nik

अजीब बात है, मैंने अपनी फ़ाइल cPanel Linux होस्टिंग से VPS में स्थानांतरित कर दी है। इससे पहले कि यह ठीक से काम कर रहा था, लेकिन यहां यह त्रुटि दिखाई दी। (हेडर से पहले मेरा कुछ HTML कोड था)। क्यों?
पाब्लो एस्कोबार

@Purushotamrawat क्या आपने " लेकिन यह दूसरे सर्वर पर काम करता है! " के बारे में भाग पढ़ा
mario

1
@PeterSMcIntyre UTF8 BOM संभवत: (इसे ठीक करें) / कोई आउटपुट बफ़रिंग सक्षम (उस पर भरोसा न करें)।
mario

199

HTTP हेडर (साथ या ) भेजने से पहले कुछ भी भेजे जाने पर यह त्रुटि संदेश चालू हो जाता है । HTTP हेडर से पहले कुछ आउटपुट के सामान्य कारण हैं:setcookieheader

  • अकस्मात व्हाट्सएप, अक्सर फाइलों की शुरुआत या अंत में, जैसे:

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

       इससे बचने के लिए, बस समापन को छोड़ दें ?>- इसे किसी भी तरह की आवश्यकता नहीं है।

  • बाइट फाइल की शुरुआत में बाइट ऑर्डर के निशान । यह जानने के लिए कि क्या मामला है, हेक्स संपादक के साथ अपनी php फाइलों की जांच करें। उन्हें बाइट्स से शुरू करना चाहिए 3F 3C। आप EF BB BFफ़ाइलों की शुरुआत से BOM को सुरक्षित रूप से हटा सकते हैं ।
  • इस तरह के कॉल करने के लिए के रूप में स्पष्ट उत्पादन, echo, printf, readfile, passthru, कोड से पहले <?आदि
  • अगर display_errorsphp.ini प्रॉपर्टी सेट है , तो php द्वारा एक चेतावनी आउटपुट की जाती है। प्रोग्रामर की गलती पर दुर्घटनाग्रस्त होने के बजाय, php चुपचाप त्रुटि को ठीक करता है और चेतावनी देता है। जब आप कॉन्फ़िगरेशन display_errorsया error_reporting कॉन्फ़िगरेशन को संशोधित कर सकते हैं , तो आपको समस्या को ठीक करना चाहिए।
    सामान्य कारणों से एक सरणी के अपरिभाषित तत्वों तक पहुंच होती है (जैसे कि इनपुट का $_POST['input']उपयोग किए बिना emptyया issetपरीक्षण करने के लिए कि क्या है), या एक स्ट्रिंग शाब्दिक के बजाय एक अपरिभाषित स्थिर का उपयोग करना (जैसा कि $_POST[input], लापता उद्धरण को नोट करें)।

आउटपुट बफ़रिंग चालू करने से समस्या दूर हो जानी चाहिए; ob_startजब तक आप बफर जारी नहीं करते, तब तक कॉल के बाद सभी आउटपुट मेमोरी में बफ़र हो जाते हैं ob_end_flush

हालाँकि, आउटपुट बफ़रिंग मुद्दों से बचता है, आपको वास्तव में यह निर्धारित करना चाहिए कि आपका एप्लिकेशन HTTP हेडर से पहले HTTP बॉडी को आउटपुट क्यों करता है। यह एक फोन कॉल लेने और अपने दिन और मौसम पर चर्चा करने से पहले फोन करने वाले को यह बताने के लिए होगा कि उसे गलत नंबर मिला है।


इसकी मदद से मुझे धन्यवाद
विश्व प्रताप

122

मुझे यह त्रुटि कई बार पहले मिली थी, और मुझे यकीन है कि सभी PHP प्रोग्रामर को यह त्रुटि कम से कम एक बार पहले मिली थी।

संभव समाधान 1

यह त्रुटि फ़ाइल के प्रारंभ होने से पहले या फ़ाइल के अंत के बाद रिक्त स्थानों के कारण हो सकती है। रिक्त स्थान यहाँ नहीं होना चाहिए।

पूर्व) यहां कोई शुल्क जमा नहीं होना चाहिए

   echo "your code here";

?>
THERE SHOULD BE NO BLANK SPACES HERE

इस त्रुटि का कारण बनने वाली फ़ाइल से संबंधित सभी फ़ाइलों की जाँच करें।

नोट: कभी-कभी EDITOR (IDE) जैसे gedit (एक डिफॉल्ट लिनक्स संपादक) सेव फाइल पर एक खाली लाइन जोड़ते हैं। ऐसा न हो कि। यदि आप लिनक्स का उपयोग कर रहे हैं। पेज के अंत में स्पेस / लाइन्स हटाने के लिए VI एडिटर का उपयोग कर सकते हैं।

संभव समाधान 2: यदि यह आपका मामला नहीं है, तो आउटपुट बफरिंग के लिए ob_start का उपयोग करें :

<?php
  ob_start();

  // code 

 ob_end_flush();
?> 

इससे आउटपुट बफ़रिंग चालू हो जाएगा और पेज बफ़र होने के बाद आपके हेडर बन जाएंगे।


18
ob_start()बस समस्या को छुपाता है; इस विशेष समस्या को हल करने के लिए इसका उपयोग न करें।
जैक

@ Ja @ck यदि मैं इसका उपयोग नहीं करता हूं ob_start(), तो मुझे इस समस्या को हल करने के लिए क्या करना चाहिए:Headers already sent
शफीज़ादेह

@ सज्जाद यदि आपको विशेष रूप से संपादक द्वारा उपयोग किए जाने के कारण त्रुटि हो रही है, तो आपको सेटिंग्स के साथ फ़ेड करना चाहिए ताकि यह समस्या का कारण बन सके, या संपादकों को स्विच कर सके। यदि आपको किसी अन्य कारण से त्रुटि हो रही है, तो आपको इस प्रश्न (विशेष रूप से स्वीकृत उत्तर) में उत्तरों के माध्यम से पढ़ना चाहिए ताकि यह पता लगाया जा सके कि वास्तव में समस्या क्या है, और इसे हल करें।
शमशेकान

3
ob_start()समस्या को "छिपाना" नहीं है, यह समस्या को हल करता है।
टीएमएस

1
मुझे ऐसी समस्या तब हुई जब मैंने अपनी फाइलें सर्वर पर अपलोड कीं, जो PHP5.3 का भी समर्थन करती थीं। PHP 5.6 या अधिक के साथ सर्वर का उपयोग करें
GGSoft

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..से पहले कोई आउटपुट (यानी या HTML कोड) नहीं होना चाहिए header(.......);

2) टैग से पहले और बाद में किसी भी व्हाइट-स्पेस (या न्यूलाइन ) को हटा दें ।<?php?>

3) सोने की राख! - जांचें कि क्या वह php फाइल (और यदि आप includeअन्य फाइलें हैं) UTF8 में BOM एन्कोडिंग के बिना (और सिर्फ UTF-8 नहीं है )। यह कई मामलों में समस्या है (क्योंकि UTF8 एन्कोडेड फ़ाइल में php फ़ाइल की शुरुआत में कुछ विशेष चरित्र है, जो आपका टेक्स्ट-एडिटर dont शो नहीं करता है) !!!!!!!!!!!

4) के बाद header(...);आप का उपयोग करना चाहिएexit;

5) हमेशा 301 या 302 संदर्भ का उपयोग करें:

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

6) त्रुटि रिपोर्टिंग चालू करें, और त्रुटि ढूंढें। आपकी त्रुटि उस फ़ंक्शन के कारण हो सकती है जो काम नहीं कर रहा है। जब आप त्रुटि रिपोर्टिंग चालू करते हैं, तो आपको हमेशा सबसे पहले त्रुटि को ठीक करना चाहिए। उदाहरण के लिए, यह "चेतावनी: date_default_timezone_get (): सिस्टम के टाइमज़ोन सेटिंग्स पर भरोसा करना सुरक्षित नहीं है।" - फिर नीचे की ओर आप "हेडर नहीं भेजे गए" त्रुटि देख सकते हैं। शीर्ष-सबसे (पहली) त्रुटि को ठीक करने के बाद, अपने पृष्ठ को फिर से लोड करें। यदि आपके पास अभी भी त्रुटियां हैं, तो फिर से शीर्ष-सबसे त्रुटि को ठीक करें।

7) यदि उपरोक्त में से कोई भी मदद नहीं करता है, तो JAVSCRIPT पुनर्निर्देशन का उपयोग करें (हालांकि, दृढ़ता से गैर-अनुशंसित विधि), कस्टम मामलों में अंतिम मौका हो सकता है ...:

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:


  • सभी PHP फ़ाइलें MUST का उपयोग करें Unix LF (linefeed) line ending
  • सभी PHP फाइलें एक के साथ समाप्त होनी चाहिए single blank line
  • समापन?> टैग omittedयुक्त फ़ाइलों से होना चाहिएonly php

मेरा विश्वास करो, निम्नलिखित मानकों का पालन करने से आप अपने जीवन से बहुत घंटे बचा सकते हैं :)


2
कई मानकों (उदाहरण के लिए Zend) के अनुसार, आपको ?>किसी भी मामले में किसी भी तरह से किसी भी फाइल में क्लोजिंग टैग नहीं लगाना चाहिए
डैनियल डब्ल्यू।

मैं विंडोज वातावरण में इसे पुन: पेश नहीं कर सकता क्योंकि यह किसी भी संयोजन का उपयोग करके काम करता है (समापन टैग, रिक्त स्थान, एंटर कुंजी दबाकर, आदि को जोड़कर)। ऐसा लगता है कि यह मुद्दा ज्यादातर लिनक्स के वातावरण में होता है।
जूनियर मेहे

@ जूनियर यह प्रजनन योग्य होना चाहिए। क्या आप उस कोड को साझा कर सकते हैं जो आप एक समान या किसी चीज़ में प्रयोग कर रहे थे?
एमडी। साहिब बिन महबूब

मैं विंडोज 7 पर हूं, जिसमें नवीनतम Wamp स्थापित है। मुझे लगता है कि यह बग लाइन के अंत के लिए छिपे हुए पात्रों से संबंधित है। मेरा Wordpress 'शॉर्टकोड.php समस्या का कारण था। मैंने इस फ़ाइल को एक साधारण फ़ंक्शन में जोड़ा और इस "हेडर भेजी" त्रुटि को आग देना शुरू कर दिया। मैंने वर्डप्रेस के साथ अपने शॉर्टकोड्स। एफपी की तुलना की है और यह CR LF(लाइन का विशिष्ट विंडोज अंत) को छोड़कर ठीक था । मैं LFइसके बजाय Wordpress रेपो (लाइन का लिनक्स अंत) से मूल फ़ाइल डाउनलोड करके इसे हल करता CR LFहूं और मैंने अपने फ़ंक्शन को थीम के फ़ंक्शन के लिए स्थानांतरित कर दिया है। के आधार पर: bit.ly/1Gh6mzN
जूनियर मेहे

@ साहब, ध्यान दें कि अभी भी मैं इस उत्तर में बताई गई बातों को पुन: प्रस्तुत नहीं कर सकता। लिनक्स वातावरण के लिए उत्तर पूरी तरह से ठीक है। मैंने ?> <?phpसिंगल ब्लैंक लाइन को जोड़ने और हटाने और बंद किए गए टैग को जोड़ने, जोड़ने और जोड़ने के बीच ऐसी रिक्तता का परीक्षण किया है ?>। विंडोज + वैंप में वे सभी संयोजन ठीक काम करते हैं। विर्ड ...
जूनियर मेहे

15

कभी-कभी जब देव प्रक्रिया में विन वर्क स्टेशन और लिनक्स सिस्टम (होस्टिंग) दोनों होते हैं और कोड में आपको संबंधित लाइन से पहले कोई आउटपुट दिखाई नहीं देता है, तो यह फाइल का प्रारूपण और यूनिक्स एलएफ (लाइनफीड) लाइन की कमी हो सकती है। ।

आमतौर पर हम इसे ठीक करने के लिए क्या करते हैं, फ़ाइल का नाम बदल दिया जाता है और LINUX सिस्टम पर नया नाम बदलने के बजाय एक नई फ़ाइल बनाते हैं, और फिर उस सामग्री को कॉपी करते हैं। कई बार यह समस्या को हल करता है क्योंकि कुछ फ़ाइलें जो कि 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()फ़ंक्शंस भी नहीं करें

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.