عکس پیش‌فرض نوشته

یکی از مهم ترین مسائل در ایجاد اسکریپت ها و برنامه های تحت وب، مدیریت خطا در این برنامه هاست. اگر شما در نوشتن برنامه خود، به مسئله مدیریت خطا توجه نکرده باشید، ممکن است ریسک های امنیتی زیادی در برنامه تحت وب شما به وجود بیاید.

شما به عنوان یک برنامه نویس بهتر است پیش بینی هایی برای به وجود آمدن خطا در برنامه خود داشته باشید تا بتوانید آنها را به خوبی مدیریت کنید.

مدیریت گزارش خطا در PHP

قطعا در هنگام کد نویسی یک اسکریپت تحت وب، یکسری خطا ها که معروف به Syntax Error هستند رفع خواهند شد ولی خطاهای دیگری وجود دارد که در هنگام اجرای برنامه با آنها مواجه میشویم؛ خطاهایی مانند:

– عدم وجود فایل برای خواندن یا نوشتن آن

– عدم دسترسی و اجازه برای ایجاد یا نوشتن فایل

– مشکل در برقراری ارتباط با پایگاه داده (دیتابیس)

و مشکلاتی از این قبیل؛ که بهتر است ما آنها را پیش بینی کرده و مدیریت کنیم تا یک برنامه حرفه ای داشته باشیم!

تابع error_reporting در زبان برنامه نویسی PHP برای تنظیم سطح های ارائه گزارش خطا در یک برنامه استفاده میشود.

به طور پیشفرض، در هنگام بروز خطا در یک اسکریپت PHP، متن خطا به همراه آدرس فایلی که خطا در آن رخ داده و اطلاعاتی نظیر پشته صدا زدن تابع ها (Call Stack) در صفحه نمایش داده میشود.

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

بنابراین بهتر است در هنگام توسعه یک برنامه نمایش این خطاها را آزاد بگذاریم ولی در هنگام انتشار محصول، نمایش خطاهای پیش آمده را غیر فعال کنیم.

برای فعال یا غیر فعال کردن نمایش خطاها در PHP میتوان از تنظیمات فایل php.ini استفاده کرد. همینچنین میتوان از دستورات زبان پی اچ پی که به همین منظور تعریف شده اند استفاده کرد.

برای فعالسازی نمایش خطا ها میتوان از کد زیر استفاده کرد:

ini_set('display_errors', 1);
error_reporting(~E_NOTICE & ~E_STRICT);

و برای غیر فعالسازی نمایش خطا از قطعه کد زیر استفاده میکنیم:

ini_set('display_errors', 0);
error_reporting(~E_WARNING & ~E_NOTICE & ~E_STRICT);

موارد موجود در تابع error_reporting موارد قابل تنظیمی هستند که تعیین میکنند چه نوع خطاهایی باید دریافت و مدیریت شوند.

توجه کنید که ورودی تابع error_reporting نباید خالی (یا 0) باشد؛ ما نیاز داریم خطا ها را دریافت کنیم ولی فقط نمایش آنها در صفحه و به کاربر را غیر فعال میکنیم. برای مثال خطاهای E_FATAL که برای ما بسیار مهم و ضروری هستند اگر نادیده گرفته شوند ممکن است مشکلاتی را برای برنامه ما ایجاد کنند.

حال که نمایش این خطا ها را در برنامه منتشر شده، غیر فعال کردیم، اکیدا توصیه میشود این خطا ها را در فایلی ذخیره کنید تا بتوانید مشکلات احتمالی که در هنگام اجرای برنامه رخ داده را بررسی و رفع کنید.

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

ini_set('log_errors' , '1');
ini_set('error_log' , '/path/to/errors_log.txt');

در اینجا ذکر چند نکته برای قطعه کد بالا ضروری هست:

1- فایل و آدرسی که به عنوان محل دخیره خطاها در تنظیم کرده اید (path/to/errors_log.txt) باید قابل نوشتن (writable) توسط وبسرویس باشند.

2- در اینجا ما یک فایل خطای جداگانه تعریف کرده ایم، در غیر اینصورت تمام گزارش های خطاها با خطاهای آپاچی (apache/web server) و سایر خطاهای آپاچی در یکجا ذخیره میشدند.

3- فایل errors_log میتواند در مسیر دایرکتوری برنامه تحت وب ما باشد ولی در نظر داشته باشید که دایرکتوری های سیستمی مثل /var/log قابل جستجو برای کاربر نیستند.

در نهایت دوباره تاکید میکنم بهتر است error_reporting روی 0 تنظیم نشود، به این دلیل که دیگر هیچ خطایی ذخیره نمیشود.

اگر مایلید مدیریت استثنا در PHP را با ساختار بلوکی try catch یاد بگیرید، آموزش زیر را دنبال کنید:

مدیریت استثنا در PHP با try catch + مثال عملی

مدیریت استثنا در PHP با try catch + مثال عملی

البته در صورتی که به فایل php.ini برنامه خود دسترسی دارید، پیشنهاد میشود نمایش خطاها در هنگام توسعه برنامه و غیرفعال کردن آن در محیط انتشار را از طریق این فایل به صورت مستقیم و دستی انجام دهید.

display_errors=On          //for Enable Display Errors

display_errors=Off        //for Disable Display Errors

دلیل این امر این است که گاهی اوقات برنامه با خطای حیاتی یا همان خطای مرگبار (Fatal Error) مواجه میشود و در اینصورت اجرای ادامه اسکریپت متوقف میشود و ممکن است اسکریپت به اجرای دستوراتی که در فایل PHP خود برای تنظیمات نمایش خطاها تعریف کرده ایم، نرسد!

برای شخصی سازی نمایش خطاها در هنگام اجرای اسکریپت میتوان از تابع set_error_handler استفاده کرد.

این تابع یک رشته را به عنوان ورودی دریافت میکند. این رشته نام تابعی است که میخواهید در هنگام برخورد با خطا، به عنوان نمایش خطا در برنامه اجرا شود.

function customErrorHandler($errNo, $errMessage) {
  echo "Error: [" . $errNo "] " . $errMessage;
}

set_error_handler("customErrorHandler");

همانطور که میبینید، در هنگام بروز خطا دو پارامتر ورودی به این تابع ارسال میشود، اولین ورودی شماره خطا (یا به اصطلاح سطح خطا) و دومین ورودی متن پیام خطای رخ داده است.

میتوانید این تابع را به هر صورتی که میخواهید بنویسید؛ برای مثال میتوانید در همین تابع

– خطای پیش آمده را به مدیر سیستم ایمیل کنید

– متن خطا را ذخیره کنید

– با استفاده از دستور die() در انتهای آن، از ادامه اجرای اسکریپت خودداری کنید.

تابع set_error_handler() مقادیر دیگری نیز به تابع ما میفرستد؛ این مقادر به ترتیب در زیر مشخص شده اند که میتوانید از آنها استفاده کنید.

function errHandler($errNo, $errMes, $errFile, $errLine, $errContext) {   }

دو ورودی اول که در بالاتر توضیح داده شدند؛ سه ورودی بعدی به صورت اختیاری تعریف میشوند.

پارامتر errFile شامل نام فایلی است که خطا در آن رخ داده است.

پارامتر errLine شماره خطی است که خطا در آن رخ داده است.

پارامتر errContect شامل آرایه ای است از هر متغیری که در محدوده خطا وجود دارد. (از PHP نسخه 7.2.0 به بعد منسوخ شده است)