همچنان یکی از چالشی ترین مباحثی که توی انجمنهای PHP بهش بر میخورم خطای معروف Headers Already Sent هست که توضیحات مختصری توی این پُست در موردش دادم و اگه اون را بخونین متوجه میشین که وجود BOM یا همون Byte Order Mark یکی از مهمترین دلایلی هست که باعث به وجود اومدن این خطا میشه.
البته همیشه BOM باعث این مشکل نیست اما اگه بتونیم بفهمیم آیا فایلی توی پروژه ما هست که آلوده (کلمه درستی نیست اما برای این مطلب کاربردیه !) به BOM باشه خودش خیلیه ! خوب توی لینوکس که اصلاً نیاز به فکر کردن نیست و با یک جستجوی ساده به دستور زیر میرسیم :
grep -rlI $'\xEF\xBB\xBF' . --include \*.php
توجه : فرض بر این هست که دستور را وقتی در پوشه اصلی پروژه هستیم میزنیم (. [نقطه] توی لینوکس یعنی پوشه جاری)
اگه فایلی نبود که قطعاً مشکل از BOM نیست و اگه چند تا فایل بود هم میتونیم یکی یکی بازشون کنیم و دوباره بدون BOM ذخیرشون کنیم ،اما اگه تعدادشون زیاد بود خوب میشه نوشت :
find . -type f -name '*.php' -exec sed '1s/^\xEF\xBB\xBF//' -i.bak {} \; -exec rm {}.bak \;
البته ممکنه این فایلها هم با وجود داشتن BOM دخالتی توی خطای صفحه مربوط نداشته باشن و باید دنبال مشکلات دیگه گشت.
واوو… داشت یادم میرفت ، نمیدونم چرا همیشه فرض میکنم خوانندگان وبلاگ من تا حالا متوجه شدن ویندوز ابزار مناسبی برای توسعه وب نیست و مهاجرت کردن به لینوکس اما خوب چه میشه کرد ، همچنان ممکنه دوستانی ویندوز را ترجیح بدهند !
در مورد ویندوز هم یک برنامه bomremover هست که کارتون را راحت میکنه و به راحتی میتونید فایلهای php را از BOM پاک کنید :
bomremover.exe D:\www\myWebsite *.php
به طور کلی هر برنامهای که بتونه محتویات فایلها را بررسی کنه و بتونید بهش مقدار HEX بدین باهاش میشه BOM ها را جستجو و حذف کرد. مقدار BOM برای UTF-8 هم EF BB BF هستش و نرم افزاری که میدونم این قابلیت را داره Total Commander هستش.