صادقانه بگم، اگه برنامهنویسی وب میکنید یا سایت وردپرسی دارین، فرقی نمیکنه تازهکار باشید یا یه حرفهای قدیمی، حتماً با خطاهای PHP سر و کار پیدا میکنید. این خطاها از یه اشتباه کوچیک توی تایپ یه اسم متغیر گرفته تا یه مشکل اساسی توی ساختار کد، همه جا کمین کردن. اما نکته مهم اینجاست که چطوری با این خطاها برخورد کنیم. مدیریت نمایش این خطاها نه تنها سرعت دیباگ کردن (اشکالزدایی) شما رو چند برابر میکنه، بلکه یه بخش خیلی کلیدی و حیاتی توی بحث امنیت وبسایتتون هم هست.
بیاید رک باشیم، هیچکس دوست نداره اطلاعات حساس سرورش به خاطر یه خطای ساده، جلوی چشم کاربر و خدای نکرده هکرها نمایش داده بشه. دقیقاً برای همین باید فعال سازی و غیر فعال سازی نمایش خطا های php رو مثل کف دست بلد باشید. اینجوری سایتتون رو هم برای خودتون راحت میکنید و هم برای کاربرا امن نگه میدارید.
خیلی از بچههایی که تازه شروع کردن، توی محیط کاری خودشون (همون لوکال خودمون)، نمایش خطاها رو فعال نگه میدارن. خب، این کار کاملاً درسته، چون شما نیاز دارید سریع بفهمید کجا گند زدید تا بتونید درستش کنید. خطاها توی این مرحله مثل نقشههایی هستن که شما رو به کد تمیزتر میرسونن. اما حواستون باشه! داستان از جایی عوض میشه که سایتتون رو میبرید روی سرور اصلی یا همون محیط تولید (Production).
نمایش خطاهای PHP توی محیط عملیاتی، یه فاجعه امنیتی به تمام معناست. اگه یه خطا بخواد مسیرهای سرور، اسم دیتابیس، یا حتی یه تیکه از کدتون رو نشون بده، عملاً دارید به هکرها اطلاعات مجانی میدید تا سایتتون رو هک کنن. بنابراین، فعال سازی و غیر فعال سازی نمایش خطا های php یه مهارت پایه و ضروریه که باید همین الان یادش بگیرید و همیشه ازش استفاده کنید.
توی این مقاله از سایت رامون طالع، قراره قدم به قدم و به زبون خودمونی ببینیم که چطور این تنظیمات حساس رو اعمال کنیم. قراره فرق بین محیط توسعه و تولید رو بفهمیم و یاد بگیریم چطور خطاها رو خیلی شیک و امن مدیریت کنیم. پس بزن بریم که کارمون رو شروع کنیم و قِلِقهای فعال سازی و غیر فعال سازی نمایش خطا های php رو یاد بگیریم!
عنوان های این مقاله
آشنایی با سلاحهای مخفی مدیریت خطا در PHP

قبل از اینکه بخوایم عملاً بریم سراغ فعال سازی و غیر فعال سازی نمایش خطا های php، اول باید بدونیم PHP چه ابزارهایی در اختیارمون گذاشته تا بتونیم این کار رو انجام بدیم. دو تا دستورالعمل خیلی مهم توی PHP وجود داره که همه کاره مدیریت نمایش و ثبت خطاها هستن و باید اسمشون رو حک کنید توی ذهنتون.
آفتابی شدن خطاها یا پنهان کاری؟
این دستورالعمل، مهمترین و اصلیترین ابزار شماست برای اینکه تصمیم بگیرید خطاهای کدتون اصلاً روی صفحه نمایش داده بشن یا نه. اینجوریه که این ابزار کلید اصلی بحث فعال سازی و غیر فعال سازی نمایش خطا های php هست.
- اگه مقدارش رو بذارید روی
On(روشن): اگه خطایی پیش بیاد، PHP بدون هیچ تعارفی پیامش رو مستقیماً میکوبه وسط صفحه وب که کاربر هم میبینه. این حالت فقط و فقط برای محیط توسعه (Development) و لوکالتون خوبه و باید همینجا باقی بمونه. - اگه مقدارش رو بذارید روی
Off(خاموش): اگه خطا رخ بده، PHP چیزی رو به کاربر نشون نمیده. به جاش یا یه صفحه سفید میاد یا یه پیام کلی مثل “خطای سرور داخلی” (Internal Server Error) به کاربر نمایش داده میشه. این حالت برای محیط تولید (Production) سایتهای واقعی، صددرصد الزامیه و باید همیشه رعایتش کنید.
ببینید، غیر فعال سازی نمایش خطا های php توی سایتهایی که کاربر واقعی دارن، عین یه دیوار امنیتی عمل میکنه. این کار جلو افشای اطلاعات فنی سرور رو میگیره و در عین حال، باعث میشه کاربرتون به جای دیدن یه عالمه کد گیجکننده، فقط یه پیام خطای مؤدبانه و دوستانه ببینه. پس حتماً مطمئن بشید که توی سایتهای عمومی، display_errors همیشه خاموش باشه. این یعنی نصف راه فعال سازی و غیر فعال سازی نمایش خطا های php رو رفتید.
ثبت خطاها برای خودمون!
خب، اگه توی محیط تولید display_errors رو خاموش کنیم، از کجا بفهمیم سایت داره خطا میده؟ اینجاست که log_errors میاد وسط.
- اگه مقدارش رو بذارید روی
On(روشن): PHP به جای اینکه خطا رو روی صفحه نشون بده، اونو توی یه فایل لاگ (Log File) توی سرورتون ذخیره میکنه. این حالت هم برای توسعه و هم برای تولید، واقعاً ضروریه و نباید خاموش بشه. - اگه مقدارش رو بذارید روی
Off(خاموش): PHP نه خطا رو نشون میده و نه ثبت میکنه. این کار رسماً خودکشی برنامهنویسی محسوب میشه، چون شما دیگه هیچوقت از مشکلات سایتتون باخبر نمیشید.
فایل لاگ خطاها، مثل دفترچه یادداشت مخفی شماست. میتونید هر چند وقت یکبار سر بزنید و ببینید چه اتفاقاتی افتاده و مشکلات رو بدون اینکه حتی یه نفر از کاربرا متوجه بشه، برطرف کنید. علاوه بر این، دستورالعمل دیگهای به اسم error_log هم داریم که وظیفهاش اینه که به PHP بگه دقیقاً این فایل لاگ خطاها رو توی کدوم آدرس سرور ذخیره کنه. حالا که این دو ابزار کلیدی رو شناختید، فلسفه فعال سازی و غیر فعال سازی نمایش خطا های php خیلی ساده میشه: توی محیط لوکال، هر دو رو فعال میکنیم. توی محیط سرور اصلی، نمایش رو غیر فعال و ثبت رو فعال نگه میداریم.
روشهای اجرایی فعال سازی و غیر فعال سازی نمایش خطاهای PHP
برای اینکه بتونیم دستورالعملهای مهم مثل display_errors و log_errors رو تنظیم کنیم، چند تا راه جلوی پامون هست. اینکه کدوم راه رو انتخاب کنید، بستگی داره به اینکه چقدر به سرور دسترسی دارید و میخواید تغییراتتون سراسری باشه یا فقط برای یه پروژه خاص.
تغییرات از طریق فایل پیکربندی اصلی
فایل php.ini رو میتونیم بگیم مغز متفکر تنظیمات PHP هست. هر تغییری که توی این فایل اعمال کنید، روی تمام اسکریپتهای PHP که روی اون سرور اجرا میشن، تأثیر میذاره. این روش، بهترین روش برای مدیریت سراسری فعال سازی و غیر فعال سازی نمایش خطا های php است.
۱. فعالسازی کامل برای توسعه (Development)
اگه دارید روی لوکال کار میکنید و میخواید با تمام وجود تمام خطاها رو ببینید، این خطوط رو توی فایل php.ini پیدا کنید یا اضافهشون کنید:
Ini, TOML
; نمایش خطاهای PHP رو روشن می کنیم
display_errors = On
; ثبت خطاها توی فایل لاگ رو هم روشن می کنیم
log_errors = On
; میگیم که همه نوع خطا رو نشون بده (E_ALL یعنی همه چیز)
error_reporting = E_ALL
۲. غیر فعالسازی ایمن برای محیط تولید (Production)
حالا اگه سایتتون رو بردید روی سرور اصلی و میخواید امنیت رو برقرار کنید، باید غیر فعال سازی نمایش خطا های php رو اعمال کنید و در عوض، روی لاگ کردن تمرکز کنید. تنظیمات شما باید این شکلی بشه:
Ini, TOML
; نمایش خطاها رو خاموش می کنیم تا هیچ اطلاعاتی لو نره
display_errors = Off
; ثبت خطاها توی فایل لاگ رو همچنان روشن نگه می داریم
log_errors = On
; مسیر دقیق فایل لاگ رو مشخص می کنیم تا بدونیم کجا دنبال خطاها بگردیم
error_log = /var/log/php/php_errors.log
یه نکته خیلی مهم که خیلیا یادشون میره: بعد از اینکه هر تغییری توی فایل php.ini اعمال کردید، باید سرور وبتون (مثلاً Apache یا Nginx) رو یه بار ریستارت (Restart) کنید. اگه این کار رو نکنید، تغییرات اعمال نمیشن و کلی وقتتون سر این موضوع ساده هدر میره. پس یادتون باشه، بعد از اعمال فعال سازی و غیر فعال سازی نمایش خطا های php توی این فایل، ریستارت سرور واجبه.
تنظیمات از طریق فایل .htaccess
بعضی وقتا، مخصوصاً توی هاستهای اشتراکی، ممکنه به فایل اصلی php.ini دسترسی نداشته باشید. نگران نباشید! فایل .htaccess میتونه نجاتتون بده. این فایل به شما اجازه میده که تنظیمات PHP رو فقط برای همون پوشهای که فایل توش قرار داره و زیرشاخههاش تغییر بدید.
فعالسازی یا غیر فعالسازی با .htaccess
برای تنظیم فعال سازی و غیر فعال سازی نمایش خطا های php اینجا از دستورالعملهای php_flag استفاده میکنیم:
Code snippet
# اگه می خواید نمایش خطا روشن باشه (برای لوکال یا توسعه)
php_flag display_errors on
php_flag log_errors on
# اگه می خواید نمایش خطا خاموش باشه (برای سرور اصلی یا تولید)
php_flag display_errors off
php_flag log_errors on
یه هشدار کوچیک: این روش فقط روی سرورهایی کار میکنه که از Apache استفاده میکنن و اجازه تغییر تنظیمات رو از این طریق میدن. اگه سرور شما Nginx هست، باید برید سراغ روشهای بعدی.
تنظیمات مستقیم توی کد PHP
گاهی اوقات، شما میخواید فقط برای یه اسکریپت خاص یا یه بخش خیلی کوچیک از برنامه، نمایش خطا رو موقتاً عوض کنید. برای این کار میتونید از توابع خود PHP توی همون فایلهای کدتون استفاده کنید. این تنظیمات، بالاترین اولویت رو دارن و هرچیزی که توی php.ini یا .htaccess تنظیم کرده باشید رو بیاثر میکنن.
مثال کد برای فعالسازی نمایش خطا:
PHP
<?php
// فعال سازی موقت برای دیباگ کردن این تیکه کد
ini_set('display_errors', 1);
ini_set('display_startup_errors', 1);
error_reporting(E_ALL);
// بقیه کدهای شما که نیاز به دیباگ دارن...
مثال کد برای غیر فعالسازی نمایش خطا:
PHP
<?php
// غیر فعال سازی نمایش برای امنیت، اگه دسترسی به php.ini ندارید
ini_set('display_errors', 0);
ini_set('display_startup_errors', 0);
// و مطمئن می شیم که لاگ خطاها روشنه
ini_set('log_errors', 1);
// بقیه کدهای شما...
توصیه دوستانه: سعی کنید تا جای ممکن، تنظیمات رو توی سطح سرور (php.ini) یا سطح پوشه (.htaccess) نگه دارید. استفاده از ini_set برای فعال سازی و غیر فعال سازی نمایش خطا های php فقط باید در موارد اضطراری یا وقتی که هیچ دسترسی دیگهای ندارید، انجام بشه. بهتره کد برنامهتون درگیر مدیریت نمایش خطا نشه.
تعیین سطح گزارشدهی خطاها با (Error Levels)
بحث فعال سازی و غیر فعال سازی نمایش خطا های php فقط این نیست که خطا رو ببینیم یا نبینیم؛ یه بخش خیلی مهم دیگه هم داره و اون اینه که کدوم یکی از خطاها رو میخوایم ببینیم یا توی لاگ ثبت کنیم. PHP انواع مختلفی از خطاها رو تعریف کرده که هر کدومشون یه معنی و یه درجه اهمیت دارن.
شناخت انواع خطاهای PHP:
PHP خطاها رو توی دستههای مختلفی قرار میده که دونستنشون خیلی بهتون کمک میکنه:
E_ERROR: خطاهای جدی و کشندهاند که باعث میشن اسکریپت بدون هیچ بحثی متوقف بشه. اینا خطرناکترینها هستن.E_WARNING: هشدارها هستن. اینا مشکلاتی رو نشون میدن که ممکنه دردسرساز باشن، ولی اجرای کد رو متوقف نمیکنن (مثلاً یه تابع قدیمی رو صدا زدید).E_NOTICE: آگاهسازیها. معمولاً نشوندهنده مشکلات خیلی کوچیک یا استانداردهای کدنویسیای هستن که رعایت نکردید (مثلاً به یه متغیری که تعریف نشده، دسترسی پیدا کردید).E_DEPRECATED: هشدار میده که یه بخشی از کدتون توی نسخههای بعدی PHP دیگه حذف میشه و باید عوضش کنید.E_ALL: شامل تمام خطاها، هشدارها و آگاهسازیهای بالاست.
استفاده هوشمندانه از error_reporting
دستورالعمل error_reporting به ما اجازه میده که با استفاده از ثابتهایی که بالا گفتیم، به PHP بگیم دقیقاً کدوم یکی از این خطاها رو باید روی صفحه نشون بده یا توی فایل لاگ ثبت کنه.
۱. تنظیمات برای محیط توسعه (دیدن تکتک جزئیات)
توی محیط توسعه، ما میخوایم از هر چیزی که ممکنه مشکلساز بشه، خبردار بشیم. حتی کوچکترین آگاهسازیها هم مهمن. به همین دلیل، شما باید بالاترین سطح گزارشدهی رو فعال کنید:
Ini, TOML
; توی php.ini یا با ini_set تنظیم می کنیم
error_reporting = E_ALL
با این کار، PHP همه خطاهای ممکن رو، چه جدی و چه کوچیک، بهتون نشون میده. این تنظیم به شما این قدرت رو میده که قبل از اینکه یه هشدار ساده تبدیل به یه مشکل بزرگ بشه، پیداش کنید و حلش کنید. این بهترین حالت فعال سازی نمایش خطا های php هست.
۲. تنظیمات برای محیط تولید (فقط ثبت خطا)
توی محیط تولید، همونطور که گفتیم، هدف اصلی ما غیر فعال سازی نمایش خطا های php است. اما در عین حال، باید مطمئن بشیم که تمام خطاهای مهم رو توی فایل لاگ ثبت میکنیم.
ممکنه فکر کنید که میتونید E_NOTICEها رو فیلتر کنید، اما بهترین و امنترین رویکرد اینه که همچنان تمام خطاها (E_ALL) رو توی فایل لاگ ثبت کنید، فقط نمایش اونها (display_errors) رو خاموش نگه دارید.
چرا باید E_ALL رو توی محیط تولید هم روشن نگه داریم؟ چون یه هشدار سادهای که توی ظاهر کماهمیت به نظر میرسه، ممکنه ریشه یک مشکل امنیتی بزرگ باشه. با ثبت همه چیز توی لاگ، شما همیشه یه دید کامل و بینقص از سلامت سایتتون دارید. یادتون نره، مهم اینه که کاربر نبینه، نه اینکه خطا وجود نداشته باشه.
Ini, TOML
; توی php.ini یا با ini_set تنظیم می کنیم
error_reporting = E_ALL
پس، جمعبندی نهایی برای محیط تولید: همیشه display_errors = Off رو با log_errors = On و error_reporting = E_ALL ترکیب کنید. این ترکیب طلایی و ایمن، قلب ماجرای فعال سازی و غیر فعال سازی نمایش خطا های php به شیوه حرفهایهاست.
توسعه یا تولید؟ (Dev vs. Prod)
یکی از بزرگترین سوتیهایی که برنامهنویسهای تازهکار میدن، اینه که موقع جابهجایی کد از محیط توسعه (Dev) به سرور اصلی (Prod)، تنظیمات مدیریت خطا رو فراموش میکنن تغییر بدن. این دو محیط به دو رویکرد کاملاً متفاوت توی بحث فعال سازی و غیر فعال سازی نمایش خطا های php نیاز دارن و شما باید این تفاوتها رو درک کنید.
محیط توسعه (Development)
هدف اصلی: دیباگ کردن سریع، راحت و با اطلاعات کامل. اینجا باید خطاها رو جار بزنید تا پیداشون کنید.
| تنظیمات | مقدار | دلیل |
display_errors | On | برای اینکه خطاها بلافاصله جلوی چشمتون ظاهر بشن و سریع مشکل رو حل کنید. |
log_errors | On | ثبت خطاها همیشه خوبه؛ اگه خطایی توی زمانبندی رخ بده، توی لاگ راحتتر پیداش میکنید. |
error_reporting | E_ALL | همه خطاها، از بزرگ تا کوچک، باید نمایش داده بشن تا کد تمیز بنویسید. |
نکته حیاتی: توی این محیط، شما آزادی کامل دارید تا هر خطایی که PHP نشون میده رو ببینید. این یعنی بهترین شکل فعال سازی نمایش خطا های php که به شما کمک میکنه.
محیط تولید (Production)
هدف اصلی: امنیت حداکثری، حفظ ظاهر سایت و جمعآوری امن دادههای خطا برای تحلیلهای بعدی. اینجا باید مثل یه نگهبان امنیتی سختگیر عمل کنید.
| تنظیمات | مقدار | دلیل |
display_errors | Off | باید خاموش باشه! جلوگیری از لو رفتن اطلاعات حساس سرور و دیتابیس. |
log_errors | On | تمام مشکلات باید ثبت بشن تا در آینده بتونید پیداشون کنید. |
error_reporting | E_ALL | همه خطاها رو توی لاگ ثبت کن، اما به کاربر نشون نده. |
نکته حیاتی: توی این محیط، غیر فعال سازی نمایش خطا های php خط قرمز ماست. ما مشکلات رو با چک کردن فایلهای لاگ دنبال میکنیم و کاربر هیچوقت از وجودشون باخبر نمیشه.
چطور سوئیچ بین این دو حالت رو خودکار کنیم؟
اگه بخواید هر بار که کد رو جابهجا میکنید دستی این تنظیمات رو عوض کنید، حتماً یه روزی یادتون میره و یه گاف امنیتی میدید. بهترین راه، اینه که این سوئیچ کردن رو خودکار کنید. به جای اینکه به php.ini دست بزنید، میتونید توی ساختار فریمورکتون یا با استفاده از یه متغیر محیطی (مثل APP_ENV)، به کدتون بفهمونید که الان توی محیط توسعه هست یا تولید. مثلاً، اگه متغیر APP_ENV برابر با development بود، کد شما خودش display_errors رو روشن کنه و اگه برابر با production بود، اون رو خاموش کنه. این روش مطمئنترین و امنترین راه برای مدیریت دائمی فعال سازی و غیر فعال سازی نمایش خطا های php هست.
چرا باید به جای نمایش، خطاهای سفارشی و شیک داشته باشیم؟
حتی زمانی که غیر فعال سازی نمایش خطا های php رو اعمال میکنید، بازم ممکنه یه خطای خیلی جدی پیش بیاد که کل اسکریپت رو متوقف کنه. نتیجه؟ یه صفحه سفید و خالی، یا نهایتاً یه پیام “خطای سرور 500” که کاربر رو کلافه میکنه. ما که نمیخوایم این اتفاق بیفته.
یک برنامهنویس حرفهای هیچوقت کاربرش رو با یه صفحه خالی تنها نمیذاره. وظیفه ما اینه که به PHP بگیم در صورت وقوع یک خطای جدی، به جای اینکه صفحهرو سفید کنه، یه کار دیگهای انجام بده.
توابع جادویی:
PHP دو تا تابع خیلی قوی برای مدیریت خطاهای سفارشی در اختیارمون گذاشته که کار رو خیلی راحت میکنه:
set_error_handler: این تابع به شما اجازه میده که مدیریت خطاهای غیر جدی (مثل Warnings و Notices) رو از دست PHP بگیرید و خودتون مدیریت کنید. شما میتونید یه تابع مخصوص خودتون رو تعریف کنید که به محض رخ دادن این خطاها، به جای نمایش پیشفرض، مثلاً خطا رو توی دیتابیس ذخیره کنه، یا حتی بفرستدش برای یه سرویس گزارشدهی حرفهای مثل Sentry. بعدش هم یه پیام خیلی دوستانه به کاربر نشون بده. با این کار، عملاً کاری فراتر از فعال سازی و غیر فعال سازی نمایش خطا های php انجام میدید و کنترل کاملی روی خطاهاتون پیدا میکنید.register_shutdown_function: این تابع در واقع آخرین امید ماست. این تابع درست زمانی اجرا میشه که اجرای اسکریپت به پایان رسیده باشه (چه با موفقیت، چه با یه خطای کشنده مثلE_ERROR). این بهترین جاییه که میتونید چک کنید آیا خطای کشندهای رخ داده یا نه. اگه یه خطای کشنده اتفاق افتاده باشه، میتونید اون صفحه سفید رو با یک صفحه خطای خیلی خوشگل و جذاب (مثل “اووپس! یه مشکلی پیش اومد.”) جایگزین کنید. این کار مطمئن میشه که کاربر تجربه بدی نداشته باشه و از اون طرف هم خطای اصلی توی فایل لاگ ثبت شده باشه تا شما بعداً برید و بررسی کنید.
این تکنیکها، تکمیلکننده استراتژی غیر فعال سازی نمایش خطا های php توی محیط تولید هستن. شما هم امنیت رو حفظ میکنید، هم اطلاعات رو لاگ میکنید و هم یه تجربه کاربری عالی رو به کاربرانتون هدیه میدید. یادتون باشه، مدیریت خطاها یه هنر هم هست!
چرا تنظیمات فعال سازی و غیر فعال سازی نمایش خطاهای PHP اعمال نمیشوند؟
واقعاً کلافهکنندهست! گاهی با تمام دقت میای و تنظیمات فعال سازی و غیر فعال سازی نمایش خطا های php رو توی php.ini یا .htaccess تغییر میدی، ولی وقتی صفحه رو رفرش میکنی، هیچی تغییر نکرده! این مشکل معمولاً از یکی از دلایل رایج زیر ناشی میشه که باید دونه دونه چکشون کنید.
۱. یادت رفته سرور رو ریستارت کنی!
اگه تنظیمات رو توی فایل اصلی php.ini عوض کردی، همونطور که قبلتر گفتم، باید حتماً سرویس وبتون (Apache یا Nginx) رو یه بار خاموش و روشن کنید. این سادهترین دلیلیه که تنظیمات اعمال نمیشن. سرور وب تا ریستارت نشه، تنظیمات جدید PHP رو نمیخونه.
۲. اولویتبندی تنظیمات داره اذیت میکنه
همیشه یادتون باشه، اولویت اعمال تنظیمات فعال سازی و غیر فعال سازی نمایش خطا های php توی PHP به این شکله: دستور ini_set توی کد > تنظیمات .htaccess > تنظیمات اصلی php.ini. اگه توی یه فایل PHP، مثلاً توی همون فایل index.php، کسی اومده باشه و از دستور ini_set('display_errors', 1) استفاده کرده باشه، این دستور هرچیزی که شما توی php.ini خاموش کرده باشید رو دوباره روشن میکنه. پس حتماً کدهاتون رو برای پیدا کردن این دستورات بررسی کنید.
۳. دارید فایل php.ini اشتباه رو ویرایش میکنید
ممکنه توی سرور، چند تا فایل php.ini وجود داشته باشه (یکی برای محیط خط فرمان، یکی برای وبسرور و …). برای اینکه بفهمید وبسرور شما دقیقاً از کدوم فایل استفاده میکنه، یه فایل PHP جدید بسازید و فقط توش بنویسید <?php phpinfo(); ?> و اون رو اجرا کنید. توی خروجی طولانی این تابع، به دنبال خط “Loaded Configuration File” بگردید. فقط همون فایلی که اینجا نشون داده میشه رو ویرایش کنید. این کار خیلی وقتا مشکل رو حل میکنه و تنظیمات فعال سازی و غیر فعال سازی نمایش خطا های php رو بالاخره اعمال میکنه.
۴. سطح گزارشدهی (Error Reporting) درسته؟
اگه display_errors شما روشنه، ولی بازم فقط خطاهای خیلی جدی (E_ERROR) رو میبینید، احتمال زیاد تنظیم error_reporting به درستی روی E_ALL تنظیم نشده. حتماً چک کنید که مقدارش درست باشه تا بتونید تمام هشدارها و آگاهسازیها رو هم ببینید.
۵. مشکل مجوزهای فایل لاگ
اگه log_errors = On هست ولی هیچ خطایی توی فایل لاگتون ثبت نمیشه، دو تا چیز رو باید چک کنید: اول اینکه مسیر فایل لاگی که با error_log مشخص کردید، واقعاً وجود داشته باشه. دوم اینکه، کاربر وبسرور شما (مثلاً کاربر www-data یا apache)، مجوز نوشتن (Write Permission) توی اون مسیر رو داشته باشه. اگه سرور نتونه توی فایل لاگ بنویسه، خطاها رو میخوره و شما رو در بیخبری کامل نگه میداره.
با چک کردن دقیق این موارد عیبیابی، میتونید مطمئن بشید که استراتژی فعال سازی و غیر فعال سازی نمایش خطا های php شما به درستی داره کار میکنه و هیچ خطایی از زیر دستتون در نمیره.
نتیجهگیری نهایی
بحث فعال سازی و غیر فعال سازی نمایش خطا های php فراتر از یه تنظیم فنی سادهست؛ این یه تصمیم استراتژیکه که به طور مستقیم روی امنیت و کارایی وبسایت شما تأثیر میذاره. ما یاد گرفتیم که نباید به خطاها اعتماد کنیم و اونها رو جلوی چشم همه قرار بدیم. فهمیدیم که چطور با استفاده از ابزارهایی مثل display_errors و log_errors و البته error_reporting، میتونیم یه خط مرزی محکم بین محیط توسعه (جایی که خطاها باید فریاد بزنن) و محیط تولید (جایی که خطاها باید در سکوت ثبت بشن) بکشیم.
همیشه این دو اصل مهم رو به یاد داشته باشید:
- قانون محیط توسعه: برای دیباگ سریع و راحت،
display_errors = Onوerror_reporting = E_ALL. - قانون محیط تولید (سرور اصلی): برای امنیت حداکثری،
display_errors = Off،log_errors = Onو همچنانerror_reporting = E_ALLرو برای ثبت کامل اطلاعات توی لاگ فعال نگه دارید.
با اجرای دقیق این تنظیمات و به کارگیری تکنیکهای سفارشیسازی مدیریت خطا، شما نه تنها یه برنامهنویس کارآمدتر میشید، بلکه یه مدیر امنیتی هوشیار برای پروژههاتون خواهید بود. هرگز توی محیط تولید، خطاهای PHP رو نمایش ندید؛ به جاش، اونها رو ثبت کنید و به طور مرتب فایلهای لاگتون رو چک کنید. این رمز موفقیت توی دنیای PHP و وب هست.
سوالات متداول
اگه display_errors رو خاموش کنم، خطاهای کشنده (Fatal Errors) هم ناپدید میشن؟
بله و خیر! اگه display_errors رو خاموش کنید، PHP پیام خطا رو روی صفحه نمایش نمیده و کاربر فقط یه صفحه خالی یا پیام خطای عمومی سرور (مثل 500) رو میبینه. اما، خطای کشنده همچنان اتفاق افتاده و اجرای اسکریپت متوقف شده. برای اینکه حتی این خطاهای کشنده هم مدیریت بشن و یه صفحه خطای شیک به کاربر نشون بدید، باید از تابع register_shutdown_function استفاده کنید تا آخرین فرصت برای مدیریت خطا رو از دست ندید.
بهترین جا برای اعمال تنظیمات فعال سازی و غیر فعال سازی نمایش خطا های php کجاست؟
بهترین جا همیشه فایل اصلی php.ini است. چون تنظیمات سراسری اعمال میشن و احتمال فراموشی یا تداخل کمتره. در مرحله دوم، اگه دسترسی به php.ini ندارید یا فقط میخواید تنظیمات یه پوشه خاص رو تغییر بدید، فایل .htaccess انتخاب خوبیه. استفاده از ini_set توی خود کد، باید آخرین گزینه باشه و فقط برای موارد خیلی خاص و موقتی استفاده بشه.
تفاوت E_ALL و E_NOTICE چیه و کدوم رو برای محیط تولید انتخاب کنم؟
E_ALL شامل همه نوع خطا، هشدار و آگاهسازی است. E_NOTICE فقط آگاهسازیهای کوچیک رو نشون میده. توی محیط تولید، شما باید error_reporting رو روی E_ALL تنظیم کنید تا تمام مشکلات توی فایل لاگ ثبت بشن. اما حتماً یادتون باشه که display_errors رو روی Off بذارید. اینجوری تمام مشکلات توی لاگ ثبت میشن (که عالیه) ولی به کاربر نمایش داده نمیشن (که برای امنیت ضروریه).
چرا بعد از تغییر php.ini بازم خطاها نمایش داده میشن؟
رایجترین دلیل اینه که یادتون رفته سرور وبتون رو ریستارت کنید (مثل آپاچی یا Nginx). دلیل بعدی اینه که ممکنه دارید فایل php.ini اشتباه رو ویرایش میکنید یا اینکه یه اسکریپت توی کدهای شما با استفاده از تابع ini_set('display_errors', 1) داره تنظیمات شما رو نادیده میگیره. حتماً phpinfo() رو اجرا کنید تا مطمئن بشید که فایل پیکربندی درست رو ویرایش میکنید.
اگه log_errors فعال باشه، فایل لاگ خطاها رو کجا باید پیدا کنم؟
محل قرارگیری فایل لاگ توسط دستورالعمل error_log توی php.ini مشخص میشه. اگه این دستورالعمل رو توی php.ini تنظیم کرده باشید، باید همونجا دنبالش بگردید. اگر تنظیم نشده باشه، PHP معمولاً خطاها رو توی لاگ اصلی وبسرور (مثلاً error.log برای آپاچی) یا لاگ سیستمی سرور (Syslog) ثبت میکنه. با اجرای تابع phpinfo() و چک کردن مقدار error_log میتونید آدرس دقیق رو پیدا کنید.


