رفع خطای "Headers already sent" در PHP | بررسی کامل

رفع خطای "Headers already sent" در PHP | بررسی کامل

وضعیت در حال برگزاری
سطح مقدماتی تا پیشرفته
1 قسمت
10
آکادمی آی تی
مدرس دوره آکادمی آی تی

حل خطای "Headers already sent" در PHP

هنگام کار با PHP، ممکن است با خطایی مواجه شوید که می‌گوید:
"Warning: Cannot modify header information - headers already sent".
این خطا به این معنی است که شما سعی کرده‌اید هدرهای HTTP (مانند هدرهای redirect یا کوکی‌ها) را بعد از ارسال خروجی به مرورگر تغییر دهید. این مشکل می‌تواند ناشی از فضاهای خالی، خطوط اضافی، یا حتی کدهای HTML باشد که قبل از فراخوانی توابعی مانند ()header()، setcookie، یا ()session_start اجرا شده‌اند.

در این مقاله، به شما نشان می‌دهیم که چگونه این خطا را تشخیص داده و آن را برطرف کنید.

۲. علت خطای "Headers already sent" چیست؟

در پروتکل HTTP، هدرها باید قبل از هر گونه محتوایی (مانند HTML) به مرورگر ارسال شوند. اگر حتی یک فاصله یا کاراکتر نامرئی قبل از هدرها ارسال شود، PHP نمی‌تواند هدرهای جدید را اضافه کند و خطای "Headers already sent" را نمایش می‌دهد.

دلایل رایج:

  • فضاهای خالی قبل از  php?> یا بعد از <?: حتی یک فاصله یا خط جدید می‌تواند باعث این خطا شود.

  • وجود BOM (نشانهٔ ترتیب بایت) در فایل‌های UTF-8: برخی ویرایشگرها به طور خودکار BOM را به فایل‌های UTF-8 اضافه می‌کنند.

  • خطاها یا اخطارهای PHP: اگر خطا یا اخطاری قبل از ارسال هدرها رخ دهد، این خطا ایجاد می‌شود.

  • خروجی‌های ناخواسته: استفاده از توابعی مانند echo، print، یا حتی کدهای HTML قبل از ارسال هدرها.

۳. تشخیص منشأ خطا

پیام خطای "Headers already sent" معمولاً شامل اطلاعاتی درباره‌ی محل شروع خروجی ناخواسته است. به عنوان مثال:

Warning: Cannot modify header information - headers already sent by (output started at /path/to/file.php:12) in /path/to/file.php on line 23

  • خط ۲۳: محل فراخوانی تابع ()header یا ()setcookie که با خطا مواجه شده است.

  • خط ۱۲: محل شروع خروجی ناخواسته (مانند فضاهای خالی، کدهای HTML، یا خطاها).

با استفاده از این اطلاعات، می‌توانید به راحتی منشأ مشکل را پیدا کنید.

۴. راه‌حل‌های رفع خطا

۱. حذف فضاهای خالی و خطوط اضافی

  • مطمئن شوید که قبل از تگ php?> و بعد از تگ <? هیچ فاصله یا خط جدیدی وجود ندارد.

  • اگر از چندین فایل PHP استفاده می‌کنید، بررسی کنید که فایل‌های include یا require نیز فضاهای خالی اضافی ندارند.

۲. بررسی BOM (نشانهٔ ترتیب بایت)

  • از ویرایشگر متن خود برای بررسی و حذف BOM استفاده کنید. در بسیاری از ویرایشگرها، گزینه‌ای مانند "ذخیره به صورت UTF-8 بدون BOM" وجود دارد.

  • اگر از IDE استفاده می‌کنید، مطمئن شوید که فایل‌های شما بدون BOM ذخیره می‌شوند.

۳. استفاده از بافرینگ خروجی

با فعال‌سازی بافرینگ خروجی، می‌توانید از ارسال زودهنگام خروجی جلوگیری کنید. این کار را می‌توانید با افزودن کد زیر به ابتدای فایل PHP خود انجام دهید:

<?php
ob_start();

این تابع تمام خروجی‌ها را در یک بافر ذخیره می‌کند و فقط زمانی آن‌ها را ارسال می‌کند که شما دستور ()ob_end_flush را فراخوانی کنید.

۴. تغییر ساختار کد

  • مطمئن شوید که تمام توابع مرتبط با هدرها (مانند ()header()، setcookie ، و ()session_start) قبل از هر گونه خروجی فراخوانی می‌شوند.
  • اگر از کدهای HTML استفاده می‌کنید، آن‌ها را به انتهای فایل منتقل کنید یا از یک سیستم قالب‌بندی استفاده کنید.

آموزش Php به صورت حرفه ای و پروژه محور | جهت مشاهده دوره اینجا کلیک فرمایید

5. سوالات متداول (FAQ)

سوال ۱: چرا این خطا فقط روی سرور خاصی رخ می‌دهد؟

این مشکل ممکن است به دلیل تنظیمات متفاوت php.ini روی سرورهای مختلف باشد. به عنوان مثال، اگر output_buffering روی یک سرور فعال باشد، ممکن است خطا نشان داده نشود.

سوال ۲: آیا می‌توانم از @ برای جلوگیری از نمایش این خطا استفاده کنم؟

استفاده از @ برای سرکوب خطاها روش مناسبی نیست. به جای آن، بهتر است مشکل اصلی را برطرف کنید.

سوال ۳: آیا این خطا بر روی عملکرد سایت تأثیر می‌گذارد؟

بله، اگر هدرهای مهمی مانند redirectها یا کوکی‌ها به درستی ارسال نشوند، ممکن است عملکرد سایت شما مختل شود.

۶. نتیجه‌گیری

خطای "Headers already sent" در PHP یک مشکل رایج اما قابل حل است. با تشخیص دقیق منشأ خطا و اعمال تغییرات مناسب در کد خود، می‌توانید این مشکل را به راحتی برطرف کنید. همیشه به یاد داشته باشید که هدرهای HTTP باید قبل از هر گونه خروجی ارسال شوند و از فضاهای خالی یا کاراکترهای نامرئی در فایل‌های خود جلوگیری کنید.

اگر همچنان با این خطا مواجه هستید، می‌توانید از ابزارهایی مانند ()ob_start برای بافرینگ خروجی استفاده کنید یا ساختار کد خود را بهینه‌سازی نمایید.

برای مشاهده نمونه کد و مثال ها از دانلود باکس فایل مورد نظر را دانلود فرمایید

جلسات دوره
call

جهت ارتباط مستقیم و مکاتبه با آکادمی آی تی می توانید از روش های تماس زیر استفاده نمایید.