English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

دروس PHP الأساسية

دروس PHP متقدمة

PHP & MySQL

دليل PHP

معالجة الأخطاء PHP

في هذا الدرس، ستتعلم كيفية استخدام وظائف معالجة الأخطاء في PHP لمعالجة حالات الأخطاء بشكل لطيف.

معالجة الأخطاء

في بعض الأحيان، قد لا يعمل تطبيقك بشكل صحيح، مما يؤدي إلى حدوث أخطاء. هناك العديد من الأسباب التي قد تؤدي إلى حدوث أخطاء، مثل:

  • قد لا يكون هناك مساحة كافية على قرص الخادم

  • قد تكون أدخلت قيمة غير صالحة في حقل الاستمارة

  • قد لا يكون الملف أو السجل في قاعدة البيانات الذي تحاول الوصول إليه موجودًا

  • قد لا يكون لديك إذن للكتابة على ملفات على القرص

  • قد تكون الخدمات التي يحتاج إليها التطبيق غير متاحة مؤقتًا

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

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

فهم مستوى الأخطاء

عادةً، عندما يواجه محرك PHP مشكلة تؤدي إلى عدم تشغيل السكربت بشكل صحيح، يتم تنشيط الخطأ. كل خطأ يتم تمثيله بواسطة قيمة صحيحة وثابت مرتبط. في الجدول التالي، تم عرض بعض المستويات الشائعة من الأخطاء:

مستوى الخطأالقيمةوصف
E_ERROR1

خطأ تشغيلي قاتل، لا يمكن استعادته. سيتم إيقاف تنفيذ السكربت فورًا.

E_WARNING2

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

E_NOTICE8

إشعار تشغيلي. يشير إلى أن السكربت واجه حالة قد تؤدي إلى خطأ، رغم أن هذا يمكن أن يحدث أيضًا عند تشغيل السكربت بشكل طبيعي.

E_USER_ERROR256

رسالة خطأ مولدة من قبل المستخدم. يشبه E_ERROR، لكنه يتم إنشاؤه بواسطة وظيفة trigger_error() في سكربت PHP وليس بواسطة محرك PHP.

E_USER_WARNING512تحذيرات مستخدم غير قاتلة. يشبه E_WARNING، لكنه يتم إنشاؤه بواسطة وظيفة trigger_error() في سكربت PHP وليس بواسطة محرك PHP.
E_USER_NOTICE1024

رسالة إشعار مولدة من قبل المستخدم. يشبه E_NOTICE، لكنه يتم إنشاؤه بواسطة وظيفة trigger_error() في سكربت PHP وليس بواسطة محرك PHP.

E_STRICT2048

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

E_ALL8191

جميع الأخطاء والإخطارات، باستثناء E_STRICT قبل PHP 5.4.0.

للحصول على مستويات أخطاء إضافية، يرجى الرجوع إلىمستويات الأخطاء في PHPالمرجع.

عندما يواجه سكربت PHP مشكلة، يُشغل محرك PHP الخطأ، ولكن يمكنك أيضًا إشعال الخطأ بنفسك لإنشاء رسائل خطأ أكثر تفاعلية للمستخدم. بهذا الشكل، يمكنك جعل التطبيق أكثر تعقيدًا. يلي بعض الطرق الشائعة لمعالجة أخطاء PHP:

معالجة الأخطاء باستخدام وظيفة die() الأساسية

اعمل على مثال يهدف فقط إلى فتح ملف نصي بصيغة فقط للقراءة.

<?php
// محاولة فتح ملف غير موجود
$file = fopen("sample.txt", "r");
?>

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

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

إذا اتبعت بعض الخطوات البسيطة، يمكننا منع المستخدم من استقبال مثل هذه رسائل الأخطاء.

<?php
if(file_exists("sample.txt")){
    $file = fopen("sample.txt", "r");
} else {
    die("خطأ: الملف الذي تحاول الوصول إليه غير موجود.");
}
?>

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

خطأ: الملف الذي تحاول الوصول إليه غير موجود.

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

إذا لم يتم العثور على ملف "sample.txt"، فإن وظيفة die() التي تم استخدامها أعلاه ستظهر رسالة خطأ مخصصة وتنتهي من تنفيذ الكود الحالي.

إنشاء وظيفة معالجة الأخطاء الخاصة بك

يمكنك إنشاء وظيفة معالجة الأخطاء الخاصة بك لمعالجة الأخطاء في وقت التشغيل التي يولده محرك PHP. توفر لك وظيفة معالجة الأخطاء الخاصة بك مرونة أكبر وتحكم أفضل في الأخطاء، حيث يمكنها فحص الأخطاء وتحديد كيفية معالجتها، قد تظهر رسالة للمستخدم أو تسجيل الخطأ في ملف أو قاعدة بيانات أو إرسال رسالة بريد إلكتروني أو محاولة إصلاح المشكلة وإكمال التشغيل أو إنهاء تنفيذ الكود أو تجاهل الخطأ.
الوظيفة الخاصة بمعالجة الأخطاء يجب أن تكون قادرة على معالجة على الأقل اثنين من المعلمات (errno وerrstr)، ولكن يمكنها أيضًا قبول ثلاثة معلمات أخرى (errfile وerrline وerrcontext) كما هو موضح أدناه:

المعلماتوصف
ضروري - المعلمات التالية هي ضرورية
errnoحدد مستوى الخطأ كعدد. هذا يعكس مستوى الخطأ المناسب (E_ERROR،E_WARNING وما إلى ذلك).
errstrحدد رسالة الخطأ كنص.
اختياري - المعلمات التالية هي اختيارية
errfileحدد اسم ملف السكربت الذي حدث فيه الخطأ كنص.
errlineحدد رقم الخطأ الذي حدث به الخطأ كنص.
errcontextحدد مصفوفة تحتوي على جميع المتغيرات الموجودة عند حدوث الخطأ ومعرفاتها.

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

<?php
// دالة معالجة الأخطاء
function customError($errno, $errstr){
    echo "<b>Error:</b> [$errno] $errstr";
}
?>

تحتاج إلى إخبار PHP باستخدام دالة معالجة الأخطاء المخصصة الخاصة بك - فقط قم بتهيئة دالة set_error_handler() المدمجة، وتمرير اسم الدالة كمعامل.

<?php
// دالة معالجة الأخطاء
function customError($errno, $errstr){
    echo "<b>Error:</b> [$errno] $errstr";
}
 
// إعداد معالج الأخطاء
set_error_handler("customError");
 
// تفعيل الخطأ
echo($test);
?>

سجلات الأخطاء

تسجيل رسائل الخطأ في ملف نصي

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

<?php
function calcDivision($dividend, $divisor) {
    if($divisor == 0) {
        trigger_error("calcDivision(): المشتق لا يمكن أن يكون صفر", E_USER_WARNING);
        return false;
    } else {
        return($dividend / $divisor);
    }
}
function customError($errno, $errstr, $errfile, $errline, $errcontext){
    $message = date("Y-m-d H:i:s - ");
    الرسالة .= "خطأ: [" . $errno . "], ". ". $errstr في $errfile في الخط $errline;
    $message .= "متغيرات:" . print_r($errcontext, true) . "\r\n";
    
    error_log($message, 3, "logs/app_errors.log");
    die("حدثت مشكلة، يرجى المحاولة مرة أخرى.");
}
set_error_handler("customError");
echo calcDivision(10, 0);
echo "هذا لن يتم طباعته أبدًا.";
?>

إرسال رسالة خطأ عبر البريد الإلكتروني

يمكنك أيضًا استخدام نفس دالة error_log() لإرسال بريد إلكتروني يحتوي على تفاصيل الخطأ.

<?php
function calcDivision($dividend, $divisor) {
    if ($divisor == 0){
        trigger_error("calcDivision(): المشتق لا يمكن أن يكون صفر", E_USER_WARNING);
        return false;
    } else {
        return($dividend / $divisor);
    }
}
function customError($errno, $errstr, $errfile, $errline, $errcontext){
    $message = date("Y-m-d H:i:s - ");
    الرسالة .= "خطأ: [" . $errno . "], ". ". $errstr في $errfile في الخط $errline;
    $message .= "متغيرات:" . print_r($errcontext, true) . "\r\n";
    
    error_log($message, 1, "[email protected]");
    die("حدثت مشكلة، يرجى المحاولة مرة أخرى. تم تقديم تقرير الخطأ إلى مدير الموقع.");
}
set_error_handler("customError");
echo calcDivision(10, 0);
echo "هذا لن يتم طباعته أبدًا.";
?>

إحداث خطأ

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

لإحداث خطأ من داخل السكربت، استدع دالة trigger_error() وقدم رسالة الخطأ التي تريد إنشاؤها:

trigger_error("حدثت مشكلة.");

تأمل في دالة حساب تقسيم رقمين.

<?php
function calcDivision($dividend, $divisor) {
    return($dividend / $divisor);
}
 
// استدعاء الدالة
echo calcDivision(10, 0);
?>

إذا تم إرسال قيمة صفر كمعامل $divisor، فإن رسالة الخطأ التي يتم إنشاؤها من قبل محرك PHP تشبه ما يلي:

تحذير: تقسيم بصفر في C:\wamp\www\project\test.php في السطر 3

يبدو أن هذا الرسالة قصيرة جدًا. انظر إلى مثال أدناه حول كيفية إنشاء خطأ باستخدام دالة trigger_error().

<?php
function calcDivision($dividend, $divisor) {
    if($divisor == 0) {
        trigger_error("لا يمكن أن يكون الموزع صفرًا", E_USER_WARNING);
        return false;
    } else {
        return($dividend / $divisor);
    }
}
 
// استدعاء الدالة
echo calcDivision(10, 0);
?>

الآن، يولد السكربت هذه رسالة الخطأ:

تحذير: لا يمكن أن يكون الموزع صفرًا في C:\wamp\www\project\error.php في السطر 4  	

كما ترونه، رسالة الخطأ التي تم إنشاؤها في المثال الثاني توضح المشكلة بشكل أوضح مقارنة بالمثال السابق.