معالجة الأخطاء في PHP
- الصفحة السابقة PHP إلكترونيات آمنة
- الصفحة التالية PHP استثناء
في PHP،معالجة الأخطاء الافتراضية بسيطة.سيتم إرسال رسالة إلى المتصفح،وسيحتوي هذا الرسالة على اسم الملف،رقم الصف،ومعرف الأخطاء.
معالجة الأخطاء في PHP
在创建脚本和 web 应用程序时,错误处理是一个重要的部分。如果您的代码缺少错误检测编码,那么程序看上去很不专业,也为安全风险敞开了大门。
معالجة الأخطاء هي جزء مهم في إنشاء السكربتات وأدوات الويب. إذا كان كودك يفتقر إلى كود التحقق من الأخطاء، فإن هذا يجعل البرنامج يبدو غير محترف ويفتح الباب أمام المخاطر الأمنية.
هذا الدليل يقدم بعض من أكثر طرق التحقق من الأخطاء المهمة في 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 الذي يتم تعيينه بواسطة مبرمج باستخدام دالة PHP trigger_error(). |
512 | E_USER_WARNING | تحذيرات مستخدم غير قاتلة. يشبه E_WARNING التي يتم تعيينها بواسطة مبرمج باستخدام دالة PHP trigger_error(). |
1024 | E_USER_NOTICE | إخطارات مولدة من المستخدم. يشبه E_NOTICE التي يتم تعيينها بواسطة مبرمج باستخدام دالة PHP trigger_error(). |
4096 | E_RECOVERABLE_ERROR | أخطاء قاتلة قابلة للإلتقاط. يشبه E_ERROR، ولكن يمكن أن يتم التقاطع بواسطة معالج خطأ معين. |
8191 | E_ALL | جميع الأخطاء والإخطارات، باستثناء مستوى E_STRICT. (في PHP 6.0، هو جزء من E_ALL) |
دعونا الآن نخلق دالة معالجة الأخطاء:
function customError($errno, $errstr) { echo "<b>خطأ:</b> [$errno] $errstr<br />"; echo "إنهاء السكريبت"; die(); }
اللغة البرمجية أعلاه هي دالة معالجة الأخطاء بسيطة. عند تنفيذها، تحصل على مستوى الخطأ والرسالة. ثم تخرج مستوى الخطأ والرسالة وتنتهي السكربت.
الآن، بعد إنشاء دالة معالجة الأخطاء، نحتاج إلى تحديد متى يتم تنفيذ هذه الدالة.
تعيين معالج الخطأ
معالج الأخطاء الافتراضي لـ PHP هو المعالج المدمج. نحن نريد تحويل الدالة أعلاه إلى معالج الأخطاء الافتراضي أثناء تشغيل السكربت.
يمكن تعديل معالج الأخطاء بحيث يتم تطبيقه فقط على بعض الأخطاء، مما يسمح للسكربت بمعالجة الأخطاء بشكل مختلف. ومع ذلك، في هذا المثال، نحن نخطط لاستخدام معالج الأخطاء المخصص الخاص بنا لجميع الأخطاء:
set_error_handler("customError");
بسبب أننا نريد أن نكتب دالة معالجة الأخطاء الخاصة بنا لمعالجة جميع الأخطاء، يحتاج set_error_handler() إلى متغير واحد فقط، ولكن يمكن إضافة متغير ثاني لتعريف مستوى الخطأ.
مثال
لاختبار هذا معالج الأخطاء، عبر محاولة طباعة متغير غير موجود:
<?php //وظيفة معالج الأخطاء function customError($errno, $errstr) { echo "<b>خطأ:</b> [$errno] $errstr"; } //تعيين معالج الأخطاء set_error_handler("customError"); //إشعال خطأ 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 //وظيفة معالج الأخطاء function customError($errno, $errstr) { echo "<b>خطأ:</b> [$errno] $errstr<br />"; echo "إنهاء السكريبت"; die(); } //تعيين معالج الأخطاء set_error_handler("customError",E_USER_WARNING); //إشعال خطأ $test=2; if ($test>1) { trigger_error("يجب أن تكون القيمة 1 أو أقل",E_USER_WARNING); } ?>
الخروج من الكود أعلاه يجب أن يشبه هذا:
خطأ: [512] يجب أن يكون القيمة 1 أو أقل إنهاء السكريبت
الآن، لقد تعلمنا كيفية إنشاء error الخاصة بنا وكيفية تحفيزها، دعنا الآن ندرس سجلات الأخطاء.
سجلات الأخطاء
بالافتراض، بناءً على إعدادات error_log في php.ini، يرسل PHP سجلات الأخطاء إلى نظام سجلات الأخطاء الخاص بالخادم أو إلى ملف. يمكن لك استخدام دالة error_log() إرسال سجلات الأخطاء إلى مكان محدد.
إرسال رسالة خطأ عبر البريد الإلكتروني إلى نفسك، هو طريقة جيدة للحصول على إعلام بخطأ محدد.
يُرسل رسالة خطأ عبر البريد الإلكتروني
في المثال التالي، إذا حدث خطأ معين، سنرسل بريدًا إلكترونيًا يحتوي على رسالة الخطأ وننهي النص:
<?php //وظيفة معالج الأخطاء function customError($errno, $errstr) { echo "<b>خطأ:</b> [$errno] $errstr<br />"; echo "تم إخطار مسترورب"; error_log("خطأ: [$errno] $errstr",1, "someone@example.com","From: webmaster@example.com"); } //تعيين معالج الأخطاء set_error_handler("customError",E_USER_WARNING); //إشعال خطأ $test=2; if ($test>1) { trigger_error("يجب أن تكون القيمة 1 أو أقل",E_USER_WARNING); } ?>
الخروج من الكود أعلاه يجب أن يشبه هذا:
خطأ: [512] يجب أن يكون القيمة 1 أو أقل تم إخطار مسترورب
البريد الوارد من الكود أعلاه يشبه هذا:
خطأ: [512] يجب أن يكون القيمة 1 أو أقل
هذه الطريقة غير مناسبة لكل الأخطاء. يجب تسجيل الأخطاء العادية باستخدام نظام التسجيل الافتراضي لـ PHP على الخادم.
- الصفحة السابقة PHP إلكترونيات آمنة
- الصفحة التالية PHP استثناء