/ در آموزش پی اچ پی, آموزش ها, اشتراک رایگان / توسط
آخرین زمان ویرایش:

آموزش PHP (پی اچ پی) – قسمت سی و دوم

(جهت دانلود و اطلاعات بیشتر به ادامه مطلب مراجعه نمائید)

آموزش PHP – مدیریت خطا

رسیدگی یا مدیریت خطاها در php

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

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

در زیر بعضی روش های معمول بررسی خطا در php توضیح داده خواهد شد:
استفاده از دستور ساده ()die
خطاهای معمولی و راه اندازی رسیدگی کننده خطا
واقعه نگاری خطاها

استفاده از تابع ()die

این تابع متنی را که به عنوان پارامتر برای آن مشخص کرده ایم، چاپ می کند و از کد جاری خارج می شود.

مثال: در این مثال با استفاده از تابع ()fopen یک فایل متنی را به صورت فقط خواندنی باز می کنیم:

<?php
$file=fopen(“welcome.txt”,”r”);
?>

اگر فایل وجود نداشته باشد، با خطای زیر مواجه می شویم:

Warning: fopen(welcome.txt) [function.fopen]: failed to open stream:
No such file or directory in C:webfoldertest.php on line 2

 برای اینکه کاربر با پیغام خطای بالا مواجه نشود، قبل از هر چیز، وجود فایل “welcome.txt” را بررسی می کنیم:

<?php
if(!file_exists(“welcome.txt”))
die(“File not found”);
else
$file=fopen(“welcome.txt”,”r”);
?>

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

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)
{
echo “<b>Error:</b> [$errno] $errstr<br />”;
echo “Ending Script”;
die();
}

 کد بالا موقعی که راه اندازی شد، “سطح خطا” و “متن خطا” را می گیرد و سپس با چاپ کردن دو مورد ذکر شده به اجرای اسکریبت پایان می دهد.

در حال حاضر باید تصمیم بگیریم که چه موقع تابع بالا، راه اندازی شود.

تنظیم رسیدگی کننده خطا

ما قصد داریم تابع “customError” را به عنوان پیشفرض رسیدگی کننده خطا در PHP معرفی کنیم، این کار به سادگی با استفاده از تابع زیر در PHP امکان پذیر است:

set_error_handler(“customError”);

نکته: یک پارامتر دوم می تواند برای مشخص کردن سطح خطا به تابع ()set_error_handler اضافه شود، ولی چون می خواهیم که تابع معمولی مان همه ی خطاها را رفع کند، ()set_error_handler تنها با یک پارامتر فراخوانی می شود.

مثال: در زیر سعی کرده ایم با چاپ متغییر “test$” که وجود ندارد تابع “رسیدگی کننده خطا” یا همان “customError” را تست کنیم:

<?php
function customError($errno, $errstr)
{
echo “<b>Error:</b> [$errno] $errstr”;
}
set_error_handler(“customError”);
echo($test);
?>

خروجی کد بالا:

Error: [8] Undefined variable: test

 راه اندازی یک خطا

در اسکریبتی که کاربران می توانند داده وارد کنند، می توان موقع رخداد یک ورودی غیرمجاز خطاها را راه اندازی کرد. در php، این کار با تابع ()trigger_error انجام می شود.

مثال: در این مثال اگر متغیر “test” بزرگتر از “۱” باشد، یک خطا رخ می دهد:

<?php
$test=2;
if ($test>1)
{
trigger_error(“Value must be 1 or below”);
}
?>

خروجی کد بالا:

Notice: Value must be 1 or below
in C:webfoldertest.php on line 5

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

مثال: در این مثال یک خطا با سطح E_USER_WARNING رخ می دهد، اگر متغیر “test” بزرگتر از “۱” باشد، تابع رسیدگی کننده خطا، راه اندازی شده و اسکریبت را خاتمه می دهیم:

<?php
function customError($errno, $errstr)
{
echo “<b>Error:</b> [$errno] $errstr<br />”;
echo “Ending Script”;
die();
}

set_error_handler(“customError”,E_USER_WARNING);

$test=2;
if ($test>1)
{
trigger_error(“Value must be 1 or below”,E_USER_WARNING);
}
?>

خروجی کد بالا:

Error: [512] Value must be 1 or below
Ending Script

 

اکنون که طریقه ی رسیدگی به خطاها و چگونگی راه اندازی آن ها را یاد گرفتیم، اجاز دهید نگاهی به واقعه نگاری (Log) خطاها بیندازیم.

واقعه نگاری خطاها (Log)

به طور پیش فرض، php یک گزارش خطا به سیستم واقعه نگاری سرورها یا یک فایل، بسته به اینکه پیکر بندی گزارش خطا چگونه درفایل php.ini تنظیم شده است ارسال می کند. با استفاده از تابع ()error_log شما می توانید گزارش های خطا را به به یک فایل مشخص شده یا یک مقصد دور ارسال کنید.

ارسال پیغام های خطاها به خودتان از طریق email می تواند روش خوبی برای آگاه شدن از خطاهای خاص باشد.

مثال: در این مثال اگر یک خطای خاص رخ دهد ما یک e-mail را همراه با یک پیغام خطا به آدرس مشخص شده می فرستیم و اسکریبت خاتمه خواهد یافت:

<?php
function customError($errno, $errstr)
{
echo “<b>Error:</b> [$errno] $errstr<br />”;
echo “Webmaster has been notified”;
error_log(“Error:[$errno]$errstr”,1,”someone@example.com”,”From:webmaster@example.com”);
}

set_error_handler(“customError”,E_USER_WARNING);

$test=2;
if ($test>1)
{
trigger_error(“Value must be 1 or below”,E_USER_WARNING);
}
?>

خروجی کد بالا:

Error: [512] Value must be 1 or below
Webmaster has been notified

و در ادامه ایمیل دریافت شده چیزی شبیه زیر خواهد بود:

Error: [512] Value must be 1 or below

توجه: این نباید برای همه ی خطاها استفاده شود، خطاهای معین باید با سیستم واقعه نگاری پیش فرض php در سرور ثبت شوند.

نوشته های مشابه

آموزش PHP (پی اچ پی) – قسمت سی و یکم

(جهت دانلود و اطلاعات بیشتر به ادامه مطلب مراجعه نمائید) (بیشتر…)

آموزش PHP (پی اچ پی) – قسمت سی و سوم

(جهت دانلود و اطلاعات بیشتر به ادامه مطلب مراجعه نمائید) (بیشتر…)

 کانال تلگرام داده باران شارژ آنلاین

نظری بدهید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *