في PHP، معالجة الأخطاء الافتراضية بسيطة. يتم إرسال رسالة خطأ إلى المتصفح تحتوي على اسم الملف ورقم السطر ورسالة تصف الخطأ.
تعد معالجة الأخطاء جزءًا مهمًا عند إنشاء البرامج النصية وتطبيقات الويب. إذا كان الكود الخاص بك يفتقر إلى ترميز اكتشاف الأخطاء، فسيبدو البرنامج غير احترافي ويفتح الباب أمام المخاطر الأمنية.
يقدم هذا البرنامج التعليمي بعضًا من أهم طرق اكتشاف الأخطاء في PHP.
سنشرح لك طرقًا مختلفة للتعامل مع الأخطاء:
عبارة "يموت ()" بسيطة
الأخطاء المخصصة ومشغلات الخطأ
تقرير الخطأ
يوضح المثال الأول برنامجًا نصيًا بسيطًا يفتح ملفًا نصيًا:
<?php$file=fopen("welcome.txt",r");?>
إذا كان الملف غير موجود، سوف تحصل على خطأ مثل هذا:
تحذير: fopen(welcome.txt) [function.fopen]: فشل في فتح الدفق: لا يوجد مثل هذا الملف أو الدليل في /www/codercto/test/test.php على السطر 2
لتجنب حصول المستخدمين على رسائل خطأ مثل تلك المذكورة أعلاه، نتحقق من وجود الملف قبل الوصول إليه:
<?phpif(!file_exists("welcome.txt")){ die("الملف غير موجود");}else{ $file=fopen("welcome.txt",r");}?>
الآن، إذا كان الملف غير موجود، سوف تحصل على رسالة خطأ مثل هذه:
الملف غير موجود
يعد الكود أعلاه أكثر كفاءة من الكود السابق لأنه يستخدم آلية بسيطة لمعالجة الأخطاء لإنهاء البرنامج النصي بعد حدوث خطأ.
ومع ذلك، فإن إنهاء البرنامج النصي ببساطة ليس مناسبًا دائمًا. دعونا نتفحص وظائف PHP البديلة لمعالجة الأخطاء.
يعد إنشاء معالج أخطاء مخصص أمرًا بسيطًا للغاية. لقد أنشأنا ببساطة وظيفة مخصصة يمكن استدعاؤها عند حدوث خطأ في PHP.
يجب أن تكون الوظيفة قادرة على التعامل مع معلمتين على الأقل (مستوى الخطأ ورسالة الخطأ)، ولكن يمكنها قبول ما يصل إلى خمس معلمات (اختياري: الملف ورقم السطر وسياق الخطأ):
وظيفة_خطأ (مستوى_الخطأ، رسالة_خطأ، ملف_خطأ، سطر_خطأ، سياق_خطأ)
المعلمة | يصف |
---|---|
error_level | مطلوب. يحدد مستوى الإبلاغ عن الأخطاء للأخطاء المعرفة من قبل المستخدم. يجب أن يكون رقما. انظر الجدول أدناه: مستويات الإبلاغ عن الأخطاء. |
error_message | مطلوب. يحدد رسائل الخطأ للأخطاء المعرفة من قبل المستخدم. |
error_file | خياري. يحدد اسم الملف الذي حدث فيه الخطأ. |
error_line | خياري. يحدد رقم السطر الذي حدث فيه الخطأ. |
error_context | خياري. يحدد مصفوفة تحتوي على كل متغير تم استخدامه عند حدوث الخطأ وقيمه. |
مستويات الإبلاغ عن الأخطاء هذه هي أنواع مختلفة من الأخطاء التي تتم معالجتها بواسطة معالجات الأخطاء المحددة من قبل المستخدم:
قيمة | ثابت | يصف |
---|---|---|
2 | تحذير إلكتروني | خطأ غير فادح في وقت التشغيل. لا تقم بإيقاف تنفيذ البرنامج النصي مؤقتًا. |
8 | إشعار إلكتروني | إخطارات وقت التشغيل. يحدث عندما يعثر البرنامج النصي على خطأ محتمل، ولكن يمكن أن يحدث أيضًا عندما يعمل البرنامج النصي بشكل طبيعي. |
256 | E_USER_ERROR | خطأ فادح أنشأه المستخدم. وهذا مشابه لـ E_ERROR الذي تم تعيينه بواسطة المبرمج باستخدام وظيفة PHPزناد_خطأ(). |
512 | E_USER_WARNING | تحذير غير فادح من إنشاء المستخدم. يشبه هذا E_WARNING الذي حدده المبرمج باستخدام وظيفة PHPزناد_خطأ(). |
1024 | E_USER_NOTICE | الإخطارات التي أنشأها المستخدم. وهذا مشابه لـ E_NOTICE الذي حدده المبرمج باستخدام وظيفة PHP مشغل_خطأ (). |
4096 | E_RECOVERABLE_ERROR | أخطاء قاتلة يمكن تعقبها. مثل E_ERROR، ولكن يمكن اكتشافه بواسطة معالجات محددة من قبل المستخدم. (راجع set_error_handler()) |
8191 | E_ALL | جميع الأخطاء والتحذيرات. (في PHP 5.4، يصبح E_STRICT جزءًا من E_ALL) |
لنقم الآن بإنشاء دالة تعالج الأخطاء:
function customError($errno, $errstr){ echo "<b>خطأ:</b> [$errno] $errstr<br>";
الكود أعلاه هو وظيفة بسيطة لمعالجة الأخطاء. عند تشغيله، فإنه يحصل على مستوى الخطأ ورسالة الخطأ. ثم يقوم بطباعة مستوى الخطأ والرسالة، وينهي البرنامج النصي.
الآن بعد أن أنشأنا وظيفة معالجة الأخطاء، نحتاج إلى تحديد وقت تشغيلها.
معالج الأخطاء الافتراضي في PHP هو معالج الأخطاء المدمج. سنقوم بتحويل الوظيفة المذكورة أعلاه إلى معالج الأخطاء الافتراضي عند تشغيل البرنامج النصي.
يمكن تعديل معالجات الأخطاء لتطبيقها على أخطاء معينة فقط، بحيث يتمكن البرنامج النصي من معالجة الأخطاء المختلفة بشكل مختلف. ومع ذلك، في هذه الحالة سنستخدم معالج الأخطاء المخصص لدينا لجميع الأخطاء:
set_error_handler("customError");
نظرًا لأننا نريد أن تتعامل وظيفتنا المخصصة مع جميع الأخطاء، فإن set_error_handler() يتطلب وسيطة واحدة فقط، ويمكن إضافة وسيطة ثانية لتحديد مستوى الخطأ.
اختبر معالج الأخطاء هذا من خلال محاولة طباعة متغير غير موجود:
<?php// وظيفة معالجة الأخطاء function customError($errno, $errstr){ echo "<b>Error:</b> [$errno] $errstr";}// تعيين وظيفة معالجة الأخطاء set_error_handler("customError") ;// خطأ الزناد echo($test);?>
يبدو إخراج الكود أعلاه كما يلي:
خطأ: [8] متغير غير محدد: اختبار
عندما يقوم المستخدم بإدخال البيانات في برنامج نصي، فمن المفيد ظهور خطأ عندما يكون إدخال المستخدم غير صالح. في PHP، يتم إنجاز هذه المهمة عن طريق وظيفة مشغل_خطأ ().
في هذا المثال، إذا كان متغير "الاختبار" أكبر من "1"، يحدث خطأ:
<?php$test=2;if ($test>1){ المشغل_خطأ("قيمة المتغير يجب أن تكون أقل من أو تساوي 1");}?>
يبدو إخراج الكود أعلاه كما يلي:
ملاحظة: يجب أن تكون القيمة المتغيرة أقل من أو تساوي 1in /www/test/codercto.php في السطر 5
يمكنك تشغيل خطأ في أي مكان في البرنامج النصي، وبإضافة معلمة ثانية، يمكنك تحديد مستوى الخطأ الذي يتم تشغيله.
أنواع الأخطاء المحتملة:
E_USER_ERROR - خطأ وقت التشغيل الفادح الذي أنشأه المستخدم. لا يمكن استرداد الخطأ. تمت مقاطعة تنفيذ البرنامج النصي.
E_USER_WARNING - تحذير وقت التشغيل غير الفادح الذي أنشأه المستخدم. لا يتم مقاطعة تنفيذ البرنامج النصي.
E_USER_NOTICE - افتراضي. إشعارات وقت التشغيل التي ينشئها المستخدم. يحدث عندما يعثر البرنامج النصي على خطأ محتمل، ولكن يمكن أن يحدث أيضًا عندما يعمل البرنامج النصي بشكل طبيعي.
في هذا المثال، إذا كان متغير "الاختبار" أكبر من "1"، فسيحدث خطأ E_USER_WARNING. في حالة حدوث E_USER_WARNING، فسنستخدم معالج الأخطاء المخصص لدينا وننهي البرنامج النصي:
<?php// وظيفة معالجة الأخطاء customError($errno, $errstr){ echo "<b>Error:</b> [$errno] $errstr<br>"; echo "End of script"; }// قم بتعيين وظيفة معالجة الأخطاء set_error_handler("customError"،E_USER_WARNING);// خطأ الزناد $test=2;if ($test>1){ مشغل_خطأ ("يجب أن تكون قيمة المتغير أقل من أو تساوي 1"،E_USER_WARNING)؛}؟>
يبدو إخراج الكود أعلاه كما يلي:
خطأ: [512] يجب أن تكون قيمة المتغير أقل من أو تساوي 1. نهاية البرنامج النصي
الآن بعد أن تعلمنا كيفية إنشاء الأخطاء الخاصة بنا وكيفية تشغيلها، فلنلقِ نظرة على تسجيل الأخطاء.
بشكل افتراضي، ترسل PHP سجلات الأخطاء إلى نظام أو ملف تسجيل الخادم، اعتمادًا على تكوين error_log في php.ini. باستخدام الدالة error_log()، يمكنك إرسال سجلات الأخطاء إلى ملف محدد أو وجهة بعيدة.
يعد إرسال رسالة خطأ عبر البريد الإلكتروني طريقة جيدة للحصول على إشعار بخطأ محدد.
في المثال أدناه، إذا حدث خطأ محدد، فسنرسل بريدًا إلكترونيًا يحتوي على رسالة خطأ وننهي البرنامج النصي:
<?php// وظيفة معالجة الأخطاء customError($errno, $errstr){ echo "<b>Error:</b> [$errno] $errstr<br>"; echo "تم إخطار مسؤول الموقع"; ("خطأ: [$errno] $errstr"،1، "[email protected]"، "من: [email protected]")؛}// قم بتعيين وظيفة معالجة الأخطاء set_error_handler("customError",E_USER_WARNING); // خطأ الزناد $test=2;if ($test>1){ Trigger_error("يجب أن تكون قيمة المتغير أقل من أو تساوي 1",E_USER_WARNING);} ?>
يبدو إخراج الكود أعلاه كما يلي:
خطأ: [512] يجب أن تكون قيمة المتغير أقل من أو تساوي 1. تم إخطار مسؤول الموقع
يبدو البريد الإلكتروني المستلم من الكود أعلاه كما يلي:
خطأ: [512] يجب أن تكون قيمة المتغير أقل من أو تساوي 1
هذه الطريقة ليست مناسبة لجميع الأخطاء. يجب تسجيل الأخطاء العامة على الخادم باستخدام نظام تسجيل PHP الافتراضي.