خطاها در PHP چگونه رخ می دهد؟
زمانیکه کدهای نوشته شده شما به هر دلیلی دارای ایراد باشه (سینتکس یا منطق) اسکریپت شما دچار خطا خواهد شد و نوع خطا به همراه توضیحات مربوط به خطا ، برای مرورگر کاربر ارسال خواهد شد.
این مکانیزم بصورت پیشفرض در PHP وجود داره و توسط یک تابع Built In پیاده سازی شده است.
راهکارهای مدیریت شخصی خطاها در PHP :
می توان از بروز خیلی از خطاها در php جلوگیری کرد و بخشی از خطاهای قابل پیش بینی را تحت کنترل خود در آورد . به مثال زیر توجه کنید :
به عنوان نمونه هرگاه شما دستور زیر را برای باز کردن یک فایل متنی بنویسید در حالیکه آن فایل بر روی سرور شما یا حداقل در مسیری که مشخص کردید وجود خارجی نداشته باشه ، خطایی رخ خواهد داد که ما می تونیم خیلی راحت با استفاده از تابعی خاص ، قبل از باز کردن فایل از وجود آن مطمئن بشیم و در صورت عدم وجود فایل بر روی حافظه سرور عملیات مربوطه (باز کردن فایل) را انجام ندهیم .
fopen("test.txt","r");
در صورت موجود نبودن فایل مشخص شده ("test.txt") ، اجرای کد بالا منجر به بروز خطا خواهد شد لذا می توان با یک مکانیزمی ساده از بروز چنین خطایی جلوگیری کرد:
<?php
if(!file_exists("test.txt"))
{
die("File not found");
}
Else
{
$file=fopen("test.txt","r");
}
?>
در کدهای بالا ما ابتدا با تابع file_exists از موجود بود فایل مورد نظر مطمئن شدیم سپس اقدام به باز کردن اون کردیم . همینطور از تابع دیگری بنام die نیز استفاده کردیم که از اجرا شدن ادامه اسکریپت جلوگیری کنیم. حالا بر اساس کدهای نوشته شده در بالا در صورت نبودن فایل در مسیر مشخص شده پیغام " File not found" به کاربر نمایش داده می شود و هندلر خطای php وارد عمل نخواهد شد . شما در این آموزش یاد میگیرید که بایستی حدالامکان کنترل برنامه رو خودمون بدست بگیریم و اجازه ندهیم که توابع مدیریت کننده خطای توکار خود php وارد عمل بشه که دلایلش رو در ادامه بهتر متوجه خواهید شد.
پس تا اینجای کار متوجه شدید که بایستی با تسلط نسبی به توابع و شناخت امکانات موجود php می توانیم تا حد امکان ، خطاهارو کنترل و مدیریت کنیم .
در ادامه با مکانیزم های دیگر php برای مدیریت شخصی خطاها بیشتر آشنا می شوید.
انواع خطاها :
در php انواع مخلتلفی از خطاها قابل بروز هستند که شما می توانید با جستجو در اینترنت با اونها آشنا بشید لذا من قصد دوباره گویی ندارم و آشنایی با انواع خطاها رو به عهده خودتون میسپارم ولی در اینجا همین قدر بدونید که بخشی از این خطاها رو می تونیم با مکانیزم هایی که در پائین همین مقاله توضیح دادم رو ، خودتون مدیریت کنید و از از کنترل تابع توکار مدیریت کننده خطای خود php در بیارید .
تابع مدیریت کننده خطاها در PHP :
مدیریت کننده خطاها در php یک تابع توکار میباشد که در زمان بروز هر گونه خطایی در زمان اجرای اسکریپت ، فراخوانی میشه و رشته ای رو در خروجی چاپ می کند که این رشته شامل نوع خطا به همراه نام فایل و شماره خطی که خطا در آن سطر از اسکریپت ایجاد شده به همراه توضیحات مربوط به اون خطا میباشد.
آیا نیازی به تغییر تابع پیشفرض مدیریت کننده خطا هست یا نه ؟
در پاسخ باید گفت که اگر شما در حال یاد گرفتن php هستید نیازی به تغییر این تابع درون اسکریپتتون نیست ولی اگر شما در حال نوشتن یک برنامه تجاری هستید توصیه میشه که حتما این کار رو انجام بدید و نگذارید تا php همه خطاهارو با تمام جزئیات برای کاربر نشون بده (نوع خطا ، نام فایل ، شماره خط خطا ، توضیحات خطا و ...) چرا که ممکنه افراد سودجو از این اطلاعات به عنوان یک حفره امنیتی استفاده کرده و سعی در نفوذ به اسکریپت شما کنن ، بنابراین بهتر است در پروژه های تجاری بجای استفاده از تابع Errorhandler خود php که کل توضیحات خطا رو برای مرورگر کاربر ارسال میکنه ، از یک تابع جایگزینی که خودمون تعریف میکنیم استفاده کنیم و بجای ارسال جزئیات فنی خطا به کاربران سایت ، این اطلاعات رو برای برنامه نویس یا مدیر فنی سایت ایمیل کنیم و برای کاربر هم فقط یک پیغام مناسب رو ارسال کنیم.
چطور میتونم تابع پیشفرض مدیریت کننده خطا در php را تغییر بدم ؟
خیلی ساده است ، شما برای تغییر تابع Errorhandler پیشفرض php کافیه یک تابع جایگزین بنویسید که دارای یکسری پارامترها هست ولی توجه داشته باشید که ترتیب پارامترهای این تابع طبق اعلان توسعه دهندگان php به قرار زیر هست :
error_level
error_message
error_file
error_line
error_context
همانطور که در بالا میبینید شما می تونید 5 پارامتر به ترتیب با عملکردهای مشخص شده در بالا به این تابع بدید.
این متغیرها (پارامترها) در زمان بروز خطا توسط تریگرهای خود php پر میشن و شما میتونید با دریافت مقادیر داخلشون ، از مشخصات خطا آگاه بشید. در ضمن نیازی نیست که حتما نام های مشخص شده در بالا رو به عنوان نام پارامتر مشخص کنید بلکه می تونید هر اسمی رو تعیین کنید ولی چیزی که مهم هست ترتیب این پارامتر ها هست که اولی نوع خطا رو مشخص می کنه و در اصل بیانگر سطح خطایی هست که رخ داده که باید به این نکته دقت کنید که تابع جایگزینی که ما میخواهیم برای مدیریت خطاهامون بجای تابع داخلی خود php تنظیم کنیم تنها قادر به مدیریت خطاهای زیر هست که در زمان بروز هر یک از سطوح زیر ، کد مربوط به اون سطح از خطا رو درون پارامتر اول تابع سفارشی ما قرار میده :
پس حالا که فهمیدیم برای بدست گرفتن مدیریت خطاهای قابل کنترل که لیست آن در بالا ذکر شد بایستی یک تابع جدید ایجاد کنیم و 5 تا پارامتر گفته شده رو بهش بدیم ، بریم سراغ اینکه چطور باید این تابع رو بنویسیم :
نوشتن این تابع هم دقیقا مثل نوشتن توابع معمولی دیگه هست ، بصورت زیر یک تابع با نام دلخواه برای مدیریت خطاهای خودتون بنویسید و پارامترهای گفته شده رو براش بنویسید :
function customError($errno, $errstr)
{
echo "<b>Error:</b> [$errno] $errstr<br>";
echo "Ending Script";
die();
}
همانطور که در بالا میبینید ، ما یک تابع با اسم دلخواه customError نوشتیم و اینجا فقط دو تا از پارامترهای بالارو بهش دادیم که باید به این نکته دقت کنید که این دو پارامتر به عنوان پارامترهای اصلی بحساب میان و 3 پارامتر دیگه بصورت آپشنال هستند و در صورت تمایل میتونید استفاده کنید.
تا اینجای کار شما فقط یک تابع جدید نوشتید تا در زمان بروز هر گونه خطایی در اجرای اسکریپت شما فراخوانی شود ولی اگر الان خودتون یک خطای عمدی در اسکریت خودتون بوجود بیارید خواهید دید که بازهم پیغام های خطای تابع مدیریت کننده خطای خود php نشون داده میشه ، پس راه چاره چیست ؟ مشخصه که باید شما به php بگید که این تابعی که نوشتیم رو به عنوان تابع مدیریت کننده خطا استفاده کنه ، نه اون تابعی که خودش بصورت built in داره
برای اینکار هم خیلی راحت از دستور زیر استفاده می کنید :
set_error_handler("customError") ;
این تابع میاد نام فانکشنی که به عنوان یک پارامتر رشته ای براش مشخص می کنیم رو به عنوان تابع پیشفرض مدیریت کننده خطاهای قابل کنترل در نظر میگیره