PHP में "Headers already sent" को कैसे ठीक करें: पूर्ण गाइड

शुरुआती लोगों के लिए ऑनलाइन Python प्रशिक्षक

Python आसानी से सीखें बिना सिद्धांत के बोझ के। स्वचालित जांच के साथ व्यावहारिक कार्य हल करें और ब्राउज़र में सीधे कोड लिखें।

पाठ्यक्रम शुरू करें

परिचय: "आपने पहले ही स्क्रीन पर कुछ भेज दिया है, और मैं नहीं कर सकता"

\n

यदि आपने कभी अपनी वेबसाइट पर एक सुंदर पेज के बजाय एक सफेद स्क्रीन देखी है जिसमें डरावना संदेश Warning: Cannot modify header information - headers already sent लिखा हो — तो आप अकेले नहीं हैं। यह शुरुआती (और न केवल) PHP डेवलपर्स के बीच सबसे आम त्रुटियों में से एक है। Stack Overflow पर इस प्रश्न ने सैकड़ों हज़ारों बार देखा गया है, और दुनिया में गलत कोड की प्रतियों की संख्या टेराबाइट्स में मापी जाती है।

\n

लेकिन अच्छी खबर यह है कि "Headers already sent" त्रुटि कोई अभिशाप नहीं है, बल्कि PHP की ओर से एक सख्त अनुस्मारक है: "अरे, आपने पहले ही HTML कोड भेजना शुरू कर दिया है, और अब आप HTTP हेडर बदलने की कोशिश कर रहे हैं। ऐसा नहीं किया जा सकता!"।

\n

इस लेख में, हम समझेंगे कि PHP में headers already sent त्रुटि क्यों होती है, इसे कैसे खोजें और, सबसे महत्वपूर्ण बात, इसे हमेशा के लिए कैसे ठीक करें। चलिए शुरू करते हैं!

\n\n

1. HTTP हेडर क्या हैं और वे "पहले ही भेजे" क्यों जाते हैं?

\n

कोड में जाने से पहले, आइए सरल शब्दों में समझें कि "हुड के नीचे" क्या होता है। जब PHP स्क्रिप्ट निष्पादित होती है, तो यह पहले ब्राउज़र को HTTP हेडर भेजती है। उनमें सेवा संबंधी जानकारी होती है: सामग्री प्रकार (Content-Type), कुकीज़ (Set-Cookie), रीडायरेक्ट (Location), प्रतिक्रिया स्थिति (200, 404, 301) और इसी तरह।

\n

और सभी हेडर के बाद ही दस्तावेज़ का मुख्य भाग भेजा जाना शुरू होता है — वह HTML जो आप पेज पर देखते हैं। PHP आपको केवल तब तक हेडर बदलने की अनुमति देता है जब तक सामग्री का पहला बाइट नहीं भेजा जाता है।

\n

जैसे ही आप स्क्रीन पर कुछ आउटपुट करते हैं (echo, print, var_dump या यहां तक कि <?php से पहले एक स्पेस के माध्यम से), PHP मानता है कि हेडर पहले ही भेजे जा चुके हैं। इसके बाद header(), setcookie() या session_start() को कॉल करने का कोई भी प्रयास घातक त्रुटि का कारण बनता है।

\n\n

1.1. त्रुटि का क्लासिक उदाहरण

\n
<?php\necho "नमस्ते, दुनिया!";\n// ओह! हमने पहले ही कुछ आउटपुट कर दिया।\nheader("Location: https://example.com");\n// Warning: Cannot modify header information - headers already sent\n?>
\n

इस उदाहरण में, echo दस्तावेज़ के मुख्य भाग में टेक्स्ट भेजता है। इसके बाद PHP रीडायरेक्ट करने के लिए हेडर को ओवरराइट नहीं कर सकता। यह पूरी तरह से तार्किक है।

\n\n

2. "Headers already sent" के शीर्ष 5 कारण

\n

यह त्रुटि केवल स्पष्ट echo के कारण नहीं हो सकती है। यहां सबसे सामान्य परिदृश्य हैं जो अनुभवी डेवलपर्स को भी फंसाते हैं:

\n
    \n
  • <?php से पहले स्पेस या खाली लाइन — सबसे लोकप्रिय "बग"। यदि फ़ाइल में ओपनिंग टैग से पहले कम से कम एक स्पेस है, तो इसे आउटपुट में भेज दिया जाएगा।
  • \n
  • अदृश्य BOM (Byte Order Mark) वर्ण — फ़ाइल UTF-8 with BOM एन्कोडिंग में सहेजी गई है। पहले 3 बाइट्स (EF BB BF) को आउटपुट माना जाता है।
  • \n
  • शामिल की गई फ़ाइलों से आउटपुट — config.php फ़ाइल में ?> के बाद एक अतिरिक्त स्पेस है।
  • त्रुटियाँ और चेतावनियाँ — यदि PHP कोई चेतावनी आउटपुट करता है (उदाहरण के लिए, अपरिभाषित चर का उपयोग करने पर), तो इसे भी सामग्री भेजना माना जाता है।
  • header() से पहले print, printf, var_dump फ़ंक्शन — कोई भी आउटपुट फ़ंक्शन हेडर को तोड़ देता है।
\n\n

3. समस्या का स्रोत कैसे खोजें: 3 विधियाँ

\n

ठीक करने से पहले, यह पता लगाना होगा कि "अतिरिक्त" आउटपुट कहाँ से आ रहा है। इनमें से किसी एक विधि का उपयोग करें।

\n\n

3.1. सभी त्रुटियों का प्रदर्शन चालू करें

\n

स्क्रिप्ट की शुरुआत में (किसी भी आउटपुट से पहले) जोड़ें:

\n
<?php\nerror_reporting(E_ALL);\nini_set('display_errors', 1);\n?>
\n

PHP अक्सर सटीक लाइन दिखाता है जहाँ आउटपुट हुआ। Output started at /path/to/file.php:12 जैसा संदेश देखें।

\n\n

3.2. error_get_last() फ़ंक्शन का उपयोग करें

\n

अंतिम त्रुटि को पकड़ा जा सकता है

ब्लॉग

पुस्तक अनुशंसाएँ