(جهت دانلود و اطلاعات بیشتر به ادامه مطلب مراجعه نمائید)
آموزش PHP – مدیریت خطا
رسیدگی یا مدیریت خطاها در php
رسیدگی به خطاها در php بسیار ساده است. به صورت پیشفرض اگر خطایی رخ دهد، یک پیغام خطا که توضیح دهنده ی خطا است، همراه با نام فایل و شماره خط به مرورگر فرستاده می شود.
هنگام ایجاد برنامه های تحت وب، بررسی خطاها یک بخش مهم است. اگر کد شما امکان بررسی خطا را نداشته باشد، در این صورت بسیار غیرحرفه ای عمل کرده اید و ممکن است در معرض خطر امنیتی قرار بگیرید.
در زیر بعضی روش های معمول بررسی خطا در php توضیح داده خواهد شد:
استفاده از دستور ساده ()die
خطاهای معمولی و راه اندازی رسیدگی کننده خطا
واقعه نگاری خطاها
استفاده از تابع ()die
این تابع متنی را که به عنوان پارامتر برای آن مشخص کرده ایم، چاپ می کند و از کد جاری خارج می شود.
مثال: در این مثال با استفاده از تابع ()fopen یک فایل متنی را به صورت فقط خواندنی باز می کنیم:
<?php |
اگر فایل وجود نداشته باشد، با خطای زیر مواجه می شویم:
Warning: fopen(welcome.txt) [function.fopen]: failed to open stream: |
برای اینکه کاربر با پیغام خطای بالا مواجه نشود، قبل از هر چیز، وجود فایل “welcome.txt” را بررسی می کنیم:
<?php |
کد بالا کارامدتر از کد قبلی است، حالا اگر فایل وجود نداشته باشد بعد از اجرای اسکریبت، پیغام خطای زیر نمایش داده می شود:
File not found |
توجه: در اسکریبت بالا، بعد از اجرای دستور ()die، ادامه اجرای اسکریبت متوقف می شود.
متوقف کردن اسکریبت، به این سادگی، همیشه راه درست نیست. بیایید نگاهی به توابع تناوبی رفع خطا در php بیندازیم.
ایجاد یک تابع رسیدگی کننده خطا (error handler)
ایجاد این تابع کاملاً ساده است، و هرگاه که در کد PHP خطایی رخ داد این تابع فراخوانی می شود.
این تابع باید بتواند حداقل با دو پارامتر کار کند(سطح خطا و پیغام خطا) اما تا پنج پارامتر را بپذیرد(اختیاری: فایل، شماره خط و متن پیغام):
نحوه استفاده:
error_function(error_level,error_message,error_file,error_line,error_context) |
توضیحات
|
پارامتر
|
الزامی است، سطح گزارش خطا را مشخص می کند. جدول زیر را برای انواع سطوح گزارش خطا ببینید.
|
error_level
|
الزامی است، پیغام خطا را برای خطای تعریف شده توسط کاربر مشخص می کند.
|
error_message
|
اختیاری است. نام فایلی را که خطا در ان رخ داده است مشخص می کند.
|
error_file
|
اختیاری است. شماره خطی را که خطا در آن رخ داده است مشخص می کند.
|
error_line
|
اختیاری است. یک آرایه که شامل تمام متغیرهای در حال استفاده هنگام رخداد خطا با مقادیرشان است را مشخص می کند.
|
error_context
|
سطوح گزارش خطا:
توضیحات
|
نام ثابت
|
مقدار
|
خطاهای زمان اجرا غیر جدی. اجرای script متوقف نمی شود
|
E_WARNING
|
۲
|
اخطارهای زمان اجرا.script چیزی پیدا کرده که ممکن است خطا باشد? اما می تواند در اجرای معمولی script نیز رخ دهد
|
E_NOTICE
|
۸
|
خطای جدی کاربرساز. مانند یک E-ERROR که توسط کابر با استفاده از تابع trigger_error( ) در php به وجود می آید.
|
E_USER_ERROR
|
۲۵۶
|
هشدار غیرجدی کاربرساز. مانند یک E_WARNING است که توسط کابر با استفاده از تابع trigger_error( ) در php به وجود می آید.
|
E_USER_WARNING
|
۵۱۲
|
اخطار کاربرساز. مانند یک E_NOTICE است که توسط کابر با استفاده از تابع trigger_error( ) در php به وجود می آید.
|
E_USER_NOTICE
|
۱۰۲۴
|
خطای جدی گرفتنی. مانند یک E_ERROR است اما بوسیله ی رفع خطای تعریف شده توسط کاربر می توان ان را گرفت(set_error_handler( ) را نیز ببینید)
|
E_RECOVERABLE_ERROR
|
۴۰۹۶
|
همه ی خطاها و هشدارها?به جز سطح E_STRICT) E_STRICT در php 6.0 جزئی از E_ALL خواهد شد.)
|
E_ALL
|
۸۱۹۱
|
حالا اجازه دهید تا یک تابع برای رسیدگی کردن به خطاها ایجاد کنیم، که شامل ورودی های زیر است:
errno$: سطح خطا
errstr$: متن خطا
function customError($errno, $errstr) |
کد بالا موقعی که راه اندازی شد، “سطح خطا” و “متن خطا” را می گیرد و سپس با چاپ کردن دو مورد ذکر شده به اجرای اسکریبت پایان می دهد.
در حال حاضر باید تصمیم بگیریم که چه موقع تابع بالا، راه اندازی شود.
تنظیم رسیدگی کننده خطا
ما قصد داریم تابع “customError” را به عنوان پیشفرض رسیدگی کننده خطا در PHP معرفی کنیم، این کار به سادگی با استفاده از تابع زیر در PHP امکان پذیر است:
set_error_handler(“customError”); |
نکته: یک پارامتر دوم می تواند برای مشخص کردن سطح خطا به تابع ()set_error_handler اضافه شود، ولی چون می خواهیم که تابع معمولی مان همه ی خطاها را رفع کند، ()set_error_handler تنها با یک پارامتر فراخوانی می شود.
مثال: در زیر سعی کرده ایم با چاپ متغییر “test$” که وجود ندارد تابع “رسیدگی کننده خطا” یا همان “customError” را تست کنیم:
<?php |
خروجی کد بالا:
Error: [8] Undefined variable: test |
راه اندازی یک خطا
در اسکریبتی که کاربران می توانند داده وارد کنند، می توان موقع رخداد یک ورودی غیرمجاز خطاها را راه اندازی کرد. در php، این کار با تابع ()trigger_error انجام می شود.
مثال: در این مثال اگر متغیر “test” بزرگتر از “۱” باشد، یک خطا رخ می دهد:
<?php |
خروجی کد بالا:
Notice: Value must be 1 or below |
یک خطا می تواند هر جایی در اسکریبت که بخواهید راه اندازی شود و با افزودن پارامتر دوم شما می توانید مشخص کنید که چه سطح خطایی راه اندازی شود.
مثال: در این مثال یک خطا با سطح E_USER_WARNING رخ می دهد، اگر متغیر “test” بزرگتر از “۱” باشد، تابع رسیدگی کننده خطا، راه اندازی شده و اسکریبت را خاتمه می دهیم:
<?php set_error_handler(“customError”,E_USER_WARNING); $test=2; |
خروجی کد بالا:
Error: [512] Value must be 1 or below |
اکنون که طریقه ی رسیدگی به خطاها و چگونگی راه اندازی آن ها را یاد گرفتیم، اجاز دهید نگاهی به واقعه نگاری (Log) خطاها بیندازیم.
واقعه نگاری خطاها (Log)
به طور پیش فرض، php یک گزارش خطا به سیستم واقعه نگاری سرورها یا یک فایل، بسته به اینکه پیکر بندی گزارش خطا چگونه درفایل php.ini تنظیم شده است ارسال می کند. با استفاده از تابع ()error_log شما می توانید گزارش های خطا را به به یک فایل مشخص شده یا یک مقصد دور ارسال کنید.
ارسال پیغام های خطاها به خودتان از طریق email می تواند روش خوبی برای آگاه شدن از خطاهای خاص باشد.
مثال: در این مثال اگر یک خطای خاص رخ دهد ما یک e-mail را همراه با یک پیغام خطا به آدرس مشخص شده می فرستیم و اسکریبت خاتمه خواهد یافت:
<?php set_error_handler(“customError”,E_USER_WARNING); $test=2; |
خروجی کد بالا:
Error: [512] Value must be 1 or below |
و در ادامه ایمیل دریافت شده چیزی شبیه زیر خواهد بود:
Error: [512] Value must be 1 or below |
توجه: این نباید برای همه ی خطاها استفاده شود، خطاهای معین باید با سیستم واقعه نگاری پیش فرض php در سرور ثبت شوند.