یکی از مهم ترین مسائل در ایجاد اسکریپت ها و برنامه های تحت وب، مدیریت خطا در این برنامه هاست. اگر شما در نوشتن برنامه خود، به مسئله مدیریت خطا توجه نکرده باشید، ممکن است ریسک های امنیتی زیادی در برنامه تحت وب شما به وجود بیاید.
شما به عنوان یک برنامه نویس بهتر است پیش بینی هایی برای به وجود آمدن خطا در برنامه خود داشته باشید تا بتوانید آنها را به خوبی مدیریت کنید.
قطعا در هنگام کد نویسی یک اسکریپت تحت وب، یکسری خطا ها که معروف به 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.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 به بعد منسوخ شده است)
این آموزش برای همیشه رایگانه! میتونید با اشتراکگذاری لینک این صفحه از ما حمایت کنید یا با خرید یه فنجون نوشیدنی بهمون انرژی بدید!
میخوام یه نوشیدنی مهمونتون کنم
سلام. با توجه به اینکه من php رو تازه شروع کردم، درباره قسمتی از این مقاله که فرمودید : ” برای فعال یا غیر فعال کردن نمایش خطاها در PHP میتوان از تنظیمات فایل php.ini استفاده کرد ”
کمی برام نامفهوم است و سوالم اینه که تنظیمات فایل php.ini و کلاً فایل php.ini چی هست؟ و چه ربطی به ini_set داره؟
سلام
خوشحالم که یادگیری زبان PHP رو شروع کردید!
فایل
php.ini
فایل پیکربندی اصلی PHP هست که تنظیمات قابل تغییر php در اون تعریف شده. این فایل متغیرهایی داره که مشخص تنظیمات خاصی رو روی اسکریپتها اعمال میکنه.گاهی دسترسی مستقیم به فایل php.ini در سرورهای اشتراکی نداریم. با تابع
ini_set()
میتونیم مقادیر اون رو تغییر بدیم. (البته اگر دسترسی این کار هم بسته نباشه!)امیدوارم جوابتون رو گرفته باشید. موفق باشید.
بسیار متشکرم.
ما که از زمپ استفاده میکنیم چطور میتونیم به فایل php.ini دسترسی داشته باشیم؟
از مسیر
xampp\php\php.ini
به این فایل میرسید. فقط یادتون باشه بعد از تغییر، حتما یک بار Apache رو restart کنید.