پردازش خطا PHP

مفہمی طور پر، پی ایچ پی میں معیاری غلطی کا ہینڈلنگ سادا ہے۔ ایک پیغام بروئر کو ارسال کیا جاتا ہے، جس میں فائل کا نام، سطر نمبر اور غلطی کی شرح شامل ہوتی ہے。

پردازش خطا PHP

في إنشاء السكربتات وأنظمة الويب، معالجة الأخطاء جزء مهم. إذا كان كودك يفتقر إلى كود التحقق من الأخطاء، فإن البرنامج سيبدو غير محترف ويفتح الباب أمام المخاطر الأمنية.

يقدم هذا الدليل بعض من أكثر طرق التحقق من الأخطاء في PHP أهمية.

سنوضح لك مختلف طرق معالجة الأخطاء:

  • الجملة البسيطة "die()"
  • الأخطاء المخصصة والمحفزات
  • تقرير الأخطاء

معالجة الأخطاء الأساسية: استخدام دالة die()

المثال الأول يعرض سكربت بسيط لفتح ملف نصي:

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

إذا لم يكن الملف موجودًا، فستحصل على خطأ مثل هذا:

تحذير: fopen(welcome.txt) [function.fopen]: فشل في فتح تدفق: 
لا يوجد ملف أو مجلد في C:\webfolder\test.php في السطر 2

لمنع وصول المستخدم إلى رسالة خطأ مثل تلك المذكورة أعلاه، سنقوم بفحص وجود الملف قبل الوصول إليه:

<?php
if(!file_exists("welcome.txt"))
 {
 die("لم يعد الملف موجودًا");
 }
else
 {
 $file=fopen("welcome.txt","r");
 }
?>

الآن، إذا لم يكن الملف موجودًا، فستحصل على رسالة خطأ مثل هذه:

لم يعد الملف موجودًا

أكثر الكود السابق فعالية، لأنه يستخدم آلية معالجة الأخطاء بسيطة للانتهاء من السكربت عند حدوث خطأ.

لكن إنهاء سكربت ببساطة ليس دائمًا الطريقة الصحيحة. دعونا ندرس الخيارات البديلة لمعالجة الأخطاء في PHP.

إنشاء معالج خطأ مخصص

إن إنشاء معالج خطأ مخصص بسيط جدًا. نحن ببساطة أنشأنا وظيفة مخصصة يمكن تفعيلها عند حدوث خطأ في PHP.

يجب أن يكون لهذه الوظيفة القدرة على التعامل مع على الأقل إثنين من المعلمات (مستوى الخطأ والمسار) وهي يمكن أن تأخذ حتى خمسة معلمات (اختيارية: ملف، رقم السطر، ومحتوى الخطأ):

النحو

error_function(error_level, error_message,
error_file, error_line, error_context)
الم 参数 توضیح
error_level

ضروري. المستوى المحدد من قبل المستخدم لتقرير الأخطاء. يجب أن يكون قيمة من قائمة.

الرجاء الرجوع إلى الجدول أدناه: مستوى تقرير الأخطاء.

error_message ضروري. رسائل الأخطاء المحددة من قبل المستخدم.
error_file اختیاری. مشخص کنید که خطا در چه فایل‌ی رخ داده است.
error_line اختیاری. مشخص کنید که خطا در چه خطی رخ داده است.
error_context اختیاری. یک آرایه را مشخص کنید که شامل هر متغیری که در زمان وقوع خطا در حال استفاده است و مقدار آن‌ها است.

سطح گزارش خطا

این سطح‌های گزارش خطا انواع مختلفی از خطاهایی هستند که برنامه‌های مدیریت خطا باید خطاها را مدیریت کنند:

مقدار متغیر توضیح
2 E_WARNING خطاهای زمان اجرا غیر حیاتی. اجرای اسکریپت متوقف نمی‌شود.
8 E_NOTICE

اخطارهای زمان اجرا

اسکریپت ممکن است خطایی را پیدا کند، اما ممکن است در طول اجرای نرمال اسکریپت نیز رخ دهد.

256 E_USER_ERROR خطاهای کاربر حیاتی. شبیه E_ERROR است که توسط برنامه‌های trigger_error() توسط برنامه‌نویسان تنظیم می‌شود.
512 E_USER_WARNING اخطارهای کاربر غیر حیاتی. شبیه E_WARNING است که توسط برنامه‌های trigger_error() توسط برنامه‌نویسان تنظیم می‌شود.
1024 E_USER_NOTICE اخطارهای کاربر تعریف شده. شبیه E_NOTICE است که توسط برنامه‌های trigger_error() توسط برنامه‌نویسان تنظیم می‌شود.
4096 E_RECOVERABLE_ERROR خطاهای حیاتی قابل انعطاف. شبیه E_ERROR است، اما می‌توانند توسط برنامه‌های مدیریت خطای تعریف شده توسط کاربر جبران شوند. (ببینید set_error_handler())
8191 E_ALL

همه‌ی خطاها و اخطارها، به استثنای سطح E_STRICT.

(در PHP 6.0، E_STRICT بخشی از E_ALL است)

حالا بیایید یک تابع مدیریت خطا ایجاد کنیم:

function customError($errno, $errstr)
 { 
 echo "<b>Error:</b> [$errno] $errstr<br />";
 echo "پایان اسکریپت";
 die();
 }

کد بالا یک تابع مدیریت خطای ساده است. زمانی که فعال می‌شود، سطح خطا و پیام خطا را دریافت می‌کند. سپس سطح خطا و پیام را نمایش می‌دهد و اسکریپت را متوقف می‌کند.

حالا که یک تابع مدیریت خطا ایجاد کرده‌ایم، باید مشخص کنیم که در چه زمانی این تابع باید فعال شود.

تنظیم مدیریت خطا

برنامه‌ی مدیریت خطای پیش‌فرض PHP برنامه‌ی مدیریت خطای داخلی است. قصد داریم که این تابع را به برنامه‌ی مدیریت خطای پیش‌فرض اسکریپت در طول اجرای اسکریپت تبدیل کنیم.

می‌توانید برنامه‌های مدیریت خطا را تغییر دهید تا فقط به برخی از خطاها اعمال شوند، بنابراین اسکریپت می‌تواند به روش‌های مختلفی با خطاها رفتار کند. اما در این مثال، قصد داریم که برنامه‌های مدیریت خطای خود را برای همه خطاها استفاده کنیم:

set_error_handler("customError");

کوئی بغیر از کورس کسی بتواند اشتباهات را مدیریت کند، set_error_handler() فقط یک پارامتر نیاز دارد، می‌توانید یک پارامتر دیگر اضافه کنید تا سطح خطا را تعیین کنید。

مثال

برای آزمایش این برنامه‌های اشتباه، از طریق نمایش متغیرهای موجود استفاده کنید:

<?php
//error handler function
function customError($errno, $errstr)
 { 
 echo "<b>اشتباه:</b> [$errno] $errstr";
 }
//set error handler
set_error_handler("customError");
//trigger error
echo($test);
?>

خروجی کد بالا باید مشابه این باشد:

اشتباه: [8] متغیر تعریف نشده: test

ایجاد اشتباه

در مکان ورودی کاربر در اسکریپت، هنگامی که ورودی کاربر نامعتبر است، ایجاد اشتباه بسیار مفید است. در PHP، این وظیفه توسط trigger_error() انجام می‌شود.

مثال

در این مثال، اگر متغیر "test" بزرگتر از "1" باشد، اشتباه رخ می‌دهد:

<?php
$test=2;
if ($test>1)
{
trigger_error("مقدار باید 1 یا کمتر باشد");
}
?>

خروجی کد بالا باید مشابه این باشد:

اخطار: مقدار باید 1 یا کمتر باشد
در C:\webfolder\test.php در خط 6

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

نوع‌های ممکن اشتباه:

  • E_USER_ERROR - اشتباه کاتعصبی زمان اجرا کاربر. اشتباه قابل بازیابی نیست. اجرای اسکریپت متوقف می‌شود.
  • E_USER_WARNING - هشدار غیرکاتعصبی زمان اجرا کاربر. اجرای اسکریپت متوقف نمی‌شود.
  • E_USER_NOTICE - پیش‌فرض. اطلاع‌رسانی زمان اجرا کاربر. اسکریپت اشتباه ممکن است پیدا کند، یا ممکن است در زمان اجرای صحیح اسکریپت رخ دهد.

مثال

در این مثال، اگر متغیر "test" بزرگتر از "1" باشد، اشتباه E_USER_WARNING رخ می‌دهد. اگر اشتباه E_USER_WARNING رخ داد، از برنامه‌های اشتباه خود استفاده می‌کنیم و اسکریپت را پایان می‌دهیم:

<?php
//error handler function
function customError($errno, $errstr)
 { 
 echo "<b>Error:</b> [$errno] $errstr<br />";
 echo "پایان اسکریپت";
 die();
 }
//set error handler
set_error_handler("customError",E_USER_WARNING);
//trigger error
$test=2;
if ($test>1)
 {
 trigger_error("ارزش باید 1 یا کمتر باشد",E_USER_WARNING);
 }
?>

خروجی کد بالا باید مشابه این باشد:

خطا: [512] ارزش باید 1 یا کمتر باشد
پایان اسکریپت

حالا که یاد گرفتیم چگونه اشتباه خود را ایجاد کنیم و چگونه آنها را فعال کنیم، بیایید به بررسی ثبت اشتباه بپردازیم.

ثبت اشتباه

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

فرستادن درخواست اشتباه به خود از طریق ایمیل، روش خوبی برای دریافت اطلاع از اشتباهات مشخص است.

درخواست اشتباه از طریق ایمیل ارسال شود

در مثال زیر، اگر خطای خاصی رخ دهد، ما ایمیل‌هایی با پیام خطا ارسال خواهیم کرد و اسکریپت را پایان خواهیم داد:}

<?php
//error handler function
function customError($errno, $errstr)
 { 
 echo "<b>Error:</b> [$errno] $errstr<br />";
 echo "مدیر وب‌سایت اطلاع داده شده است";
 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("ارزش باید 1 یا کمتر باشد",E_USER_WARNING);
 }
?>

خروجی کد بالا باید مشابه این باشد:

خطا: [512] ارزش باید 1 یا کمتر باشد
مدیر وب‌سایت اطلاع داده شده است

ایمیل‌هایی که از کد بالا دریافت می‌شود مشابه این است:

خطا: [512] ارزش باید 1 یا کمتر باشد

این روش برای همه خطاها مناسب نیست. خطاهای معمول باید از طریق استفاده از سیستم ثبت پیش‌فرض PHP در سرور ثبت شوند.