
توی دوره رایگان PHP، هر چیزی که برای حرفهای شدن نیاز داری رو یاد میگیری! از مفاهیم پایه تا پیشرفته، همراه با یه پروژه واقعی برای ساخت یه سایت مثل آپارات.
مشاهده بیشتر
توی این دوره با هم یه وبسایت خبری واقعی رو از صفر میسازیم! از طراحی دیتابیس و احراز هویت تا ساخت API و یه پنل مدیریت حرفهای، همه رو یاد میگیریم و آماده پروژههای واقعی میشی!
مشاهده بیشترمشخصات مقاله
آموزش مدیریت خطا (Error Handling) در PHP
آموزش مدیریت خطا (Error Handling) در PHP :
سیستم مدیریت خطای پیش فرض یا default error handling در PHP بسیار ساده عمل می کند. این سیستم در هنگام بروز خطا، یک پیام هشدار حاوی نام فایل، شماره خط بروز خطا به همراه توصیفی از شرح خطا را به مرور گر ارسال می کند.
در هنگام طراحی اسکریپت ها و نرم افزارهای تحت وب، مدیریت خطا یا errorHandling بخش مهمی از کد می باشد. اگر کد شما نتواند error های احتمالی را چک کند، برنامه تان بسیار غیر حرفه ای به نظر رسیده و می تواند شما را با چالش های امنیتی رو به رو کند.
در این بخش آموزش PHP، مهم ترین متدهای چک کردن خطا در زبان PHP را بررسی خواهیم کرد. این متدهای مدیریت خطا عبارتند از :
- دستورهای ساده با تابع “die()”.
- error های خاص و بررسی تحریک کننده خطا (error triggers).
- آموزش نحوه گزارش کردن خطاها یا (error reporting).
آموزش روش پایه مدیریت خطا PHP-تابع die() :
در کد مثال اول مدیریت خطا، به وسیله اسکریپت زیر برنامه قصد دارد تا یک فایل متنی (text file) را باز کند :
1 2 3 4 | <!--?php $file = fopen ( "welcome.txt" , "r" ); ?--> <button></button> |
اگر در کد فوق، فایل مورد نظر وجود نداشته باشد، احتمالا با خطاهایی هماند متن زیر مواجه خواهید شد :
1 2 3 | Warning: fopen (welcome.txt) [ function . fopen ]: failed to open stream: No such file or directory in C:\webfolder\test.php on line 2 <button></button> |
برای جلوگیری از نمایش پیغام خطایی مثل متن فوق به کاربر، کد را به صورت زیر تغییر داده ایم. در این کد جدید ابتدا برنامه وجود فایل را بررسی کرده و سپس در صورت موجود بودن آن، اقدام به باز کردن فایل می کند:
1 2 3 4 5 6 7 8 | <!--?php if (! file_exists ( "welcome.txt" )) { die ( "File not found" ); } else { $file = fopen ( "welcome.txt" , "r" ); } ?--> <button></button> |
حال اگر فایل مورد نظر وجود نداشته باشد، برنامه پیغام خطای زیر را صادر می کند :
1 2 | File not found <button></button> |
کد روش دوم خطایابی، بسیار بهتر و تاثیرگذارتر از روش اول است. زیرا با استفاده از یک مکانیزم ساده خطایابی، قبل از بروز خطا، اسکریپت را از ادامه کار متوقف می کند.
اما، همواره متوقف کردن اسکریپت از ادامه اجرا، روش خوبی برای مدیریت خطا نیست. در ادامه به گزینه های دیگری که زبان PHP برای مدیریت خطا در اختیارمان قرار داده است، خواهیم پرداخت.
ایجاد یک مدیریت کننده خطا دلخواه (Custom Error Handling) :
ایجاد یک مدیریت کنده دلخواه خطا (Custom Error Handling) در زبان PHP، کار نسبتا ساده ای است. می توانیم به راحتی یک تابع دلخواه PHP را ایجاد کنیم تا در هنگام بروز خطا، فراخوانی شود.
تابع دلخواهی که برای مدیریت خطا ایجاد می کنیم، بایستی حداقل بتواند دو پارامتر خطا (درجه خطا (error level) و پیام خطا (error message)) را مدیریت کند و تا پارامتر اختیاری را دریافت کند (پارامترهای اختیاری مثل نام فایل، شماره خط کد بروز خطا و محتویات خطا).
ساختار کلی تعریف یک تابع مدیریت کننده دلخواه در PHP به صورت زیر است :
1 2 | error_function(error_level,error_message,error_file,error_line,error_context) <button></button> |
جدول درجه های خطا در PHP :
در بخش قبل گفتیم که هر خطای رخ داده در برنامه های PHP شامل یک درجه یا level است که درجات آن را در لیست زیر مشاهده می کنید :
اکنون بیایید یک تابعی ایجاد کنیم تا خطاهای موجود را مدیریت یا handle کند. کد تابع به صورت زیر است :
1 2 3 4 5 6 | function customError( $errno , $errstr ) { echo "<b>Error:</b> [$errno] $errstr<br>" ; echo "Ending Script" ; die (); } <button></button> |
کد فوق یک تابع ساده مدیریت خطا (Error Handler) را نشان داده که در زمان فراخوانی شدن دو مقدار دریافت می کند. یک مقدار درجه خطا (error level) و دیگر پیام مرتبط با خطا (error message) . سپس تابع درجه و پیام خطا را در خروجی نشان داده و اجرای اسکریپت را متوقف می کند.
اکنون که یک تابع مدیریت کننده خطا را طراحی کردیم، بایستی تعیین کنیم چه زمانی لازم است این تابع فراخوانی و اجرا (trigger) شود.
آموزش تنظیم تابع مدیریت خطا در PHP :
تابع مدیریت خطای پیش فرض در PHP یک تابع پیش ساخته است که در سورس اصلی این زبان تعریف شده. در این درس قصد داریم تا تابعی که خودمان طراحی کردیم را به عنوان تابع پیش فرض مدیریت خطا در برنامه قرار دهیم.
این امکان نیز وجود دارد که یک تابع مدیریت خطا را به گونه ای تنظیم کنیم تا فقط برای برخی error ها اجرا شود، در این صورت می توان error های مختلف را به روش های گوناگون مدیریت کرد. اما در مثال عملی این درس، قصد داریم تابع خود را برای مدیریت تمامی خطاهای برنامه تنظیم کنیم :
1 2 | set_error_handler( "customError" ); <button></button> |
از آنجایی که می خواهیم تابع مدیریت خطای دلخواه ما، تمامی error های احتمالی برنامه را مدیریت کند، تابع set_error_handler() فقط به یک پارامتر نیاز خواهد داشت و در پارامتر دوم می توان درجه خطا را تنظیم کرد.
مثال عملی :در کد مثال عملی زیر، قصد داریم تا تابع مدیریت خطا را با تلاش برای چاپ مقدار یک متغیر که وجود ندارد، امتحان کنیم :
1 2 3 4 5 6 7 8 9 10 11 | <!--?php //error handler function function customError( $errno , $errstr ) { echo "<b-->Error: [$errno] $errstr" ; } //set error handler set_error_handler( "customError" ); //trigger error echo ( $test ); ?> <button></button> |
خروجی کد مثال فوق به صورت زیر خواهد بود :
1 2 | Error: [8] Undefined variable: test <button></button> |
فعال کردن یک خطا یا error trigger :
در اسکریپت هایی که کاربر می تواند اطلاعاتی را درون کادرهای متن وارد کند، فعال کردن error ها در زمان ارسال مقادیر غیر مجاز بسیار کاربردی است. در زبان PHP این کار با استفاده از تابع trigger_error() انجام می شود.
مثال عملی :در کد مثال عملی زیر، در صورتی که مقدار متغیر “test” بیشتر از یک باشد، خطا مورد نظر فعال می شود :
1 2 3 4 5 6 7 | <!--?php $test =2; if ( $test -->=1) { trigger_error( "Value must be 1 or below" ); } ?> <button></button> |
خروجی کد مثال فوق به صورت زیر خواهد بود :
1 2 3 | Notice: Value must be 1 or below in C:\webfolder\test.php on line 6 <button></button> |
یک error دلخواه را می توان در هر کجای اسکریپت که لازم باشد، فراخوانی کرده و پارامتر دوم در تابع تعیین کننده درجه خطا (error level) می باشد. انواع مختلف error های محتمل عبارتند از :
در این حالت اسکریپت ممکن است به موردی برخورد کرده باشد که از نظر آن خطا بوده، ولی امکان دارد در هنگام اجرای برنامه به صورت عادی رخ دهد.
مثال عملی :در کد مثال عملی زیر، در صورتی که مقدار متغیر “test” از بیشتر باشد، یک E_USER_WARNING رخ خواهد داد. اگر E_USER_WARNING رخ دهد، ما از تابع مدیریت خطای مورد نظر خود استفاده کرده و اجرای اسکریپت را متوقف خواهیم کرد :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | <!--?php //error handler function function customError( $errno , $errstr ) { echo "<b-->Error: [$errno] $errstr<br>" ; echo "Ending Script" ; die (); } //set error handler set_error_handler( "customError" ,E_USER_WARNING); //trigger error $test =2; if ( $test >=1) { trigger_error( "Value must be 1 or below" ,E_USER_WARNING); } ?> <button></button> |
خروجی کد مثال فوق به صورت زیر خواهد بود :
1 2 3 | Error: [512] Value must be 1 or below Ending Script <button></button> |
هم اکنون که با نحوه طراحی error های دلخواه در سطح برنامه و فراخوانی آن ها آشنا شدید، قصد داریم تا نحوه ثبت کردن خطا یا (error logging) را در PHP آموزش دهیم.
آموزش ثبت خطا یا error logging در PHP :
به صورت پیش فرض و بر حسب این که مقدار error-log در فایل تنظیمات برنامه (فایل php.ini) چگونه تنظیم شده باشد، PHP در هنگام بروز خطا، یک کد ثبت خطا یا error log را به سیستم خطاها یا به یک فایل خاصی ارسال می کند.
با استفاده از تابع error_log() می توانید ثبت جزئیات خطاها (error log) را به یک فایل خاص یا یک سرور راه دور ارسال کنید. همچنین ارسال پیام های خطا به وسیله email نیز یک راه بسیار مطمئن جهت اطلاع از بروز خطا در سیستم است.
اموزش نحوه ارسال یک پیام خطا (Error Message) با ایمیل :
در کد مثال عملی زیر، در صورتی که یک خطای خاص رخ دهد، پیام خطایی را به وسیله ایمیل به کاربر ارسال کرده و اجرای اسکریپت را متوقف کرده ایم :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | <!--?php //error handler function function customError( $errno , $errstr ) { echo "<b-->Error: [$errno] $errstr<br>" ; echo "Webmaster has been notified" ; error_log ( "Error: [$errno] $errstr" ,1, "someone@example.com" , "From: webmaster@example.com" ); } //set error handler set_error_handler( "customError" ,E_USER_WARNING); //trigger error $test =2; if ( $test >=1) { trigger_error( "Value must be 1 or below" ,E_USER_WARNING); } ?> <button></button> |
خروجی کد مثال به صورت زیر است که توسط ایمیل به کاربر ارسال می شود :
1 2 3 | Error: [512] Value must be 1 or below Webmaster has been notified <button></button> |
در نهایت، متن ایمیل خطایی که کاربر دریافت می کند، به صورت زیر خواهد بود :
1 2 | Error: [512] Value must be 1 or below <button></button> |
البته ارسال خطا به وسیله ایمیل در موارد حیاتی ضروریت داشته و مابقی error ها را بایستی توسط سیستم ثبت کننده خطاهای PHP در فایل log ذخیره نمود.