English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
في هذا الدرس، ستتعلم كيفية استخدام وظائف معالجة الأخطاء في PHP لمعالجة حالات الأخطاء بشكل لطيف.
في بعض الأحيان، قد لا يعمل تطبيقك بشكل صحيح، مما يؤدي إلى حدوث أخطاء. هناك العديد من الأسباب التي قد تؤدي إلى حدوث أخطاء، مثل:
قد لا يكون هناك مساحة كافية على قرص الخادم
قد تكون أدخلت قيمة غير صالحة في حقل الاستمارة
قد لا يكون الملف أو السجل في قاعدة البيانات الذي تحاول الوصول إليه موجودًا
قد لا يكون لديك إذن للكتابة على ملفات على القرص
قد تكون الخدمات التي يحتاج إليها التطبيق غير متاحة مؤقتًا
تسمى هذه الأنواع من الأخطاء بأخطاء تشغيلية لأنها تحدث أثناء تشغيل السكربت. إنها تختلف عن أخطاء النصوص التي يجب إصلاحها قبل تشغيل السكربت.
المطالبات الاحترافية يجب أن تحتوي على وظائف لمعالجة هذه الأخطاء التشغيلية بشكل مناسب. عادةً، هذا يعني إعلام المستخدم بشكل واضح ودقيق بما يحدث.
عادةً، عندما يواجه محرك PHP مشكلة تؤدي إلى عدم تشغيل السكربت بشكل صحيح، يتم تنشيط الخطأ. كل خطأ يتم تمثيله بواسطة قيمة صحيحة وثابت مرتبط. في الجدول التالي، تم عرض بعض المستويات الشائعة من الأخطاء:
مستوى الخطأ | القيمة | وصف |
---|---|---|
E_ERROR | 1 | خطأ تشغيلي قاتل، لا يمكن استعادته. سيتم إيقاف تنفيذ السكربت فورًا. |
E_WARNING | 2 | تحذير تشغيلي. ليس قاتلاً، معظم الأخطاء تنتمي إلى هذا النوع. لن يتوقف تنفيذ السكربت. |
E_NOTICE | 8 | إشعار تشغيلي. يشير إلى أن السكربت واجه حالة قد تؤدي إلى خطأ، رغم أن هذا يمكن أن يحدث أيضًا عند تشغيل السكربت بشكل طبيعي. |
E_USER_ERROR | 256 | رسالة خطأ مولدة من قبل المستخدم. يشبه E_ERROR، لكنه يتم إنشاؤه بواسطة وظيفة trigger_error() في سكربت PHP وليس بواسطة محرك PHP. |
E_USER_WARNING | 512 | تحذيرات مستخدم غير قاتلة. يشبه E_WARNING، لكنه يتم إنشاؤه بواسطة وظيفة trigger_error() في سكربت PHP وليس بواسطة محرك PHP. |
E_USER_NOTICE | 1024 | رسالة إشعار مولدة من قبل المستخدم. يشبه E_NOTICE، لكنه يتم إنشاؤه بواسطة وظيفة trigger_error() في سكربت PHP وليس بواسطة محرك PHP. |
E_STRICT | 2048 | بشكل صحيح ليس خطأ، لكن بمجرد أن يواجه PHP كود قد يؤدي إلى مشكلة أو عدم التوافق الأمامي، يتم تنشيطه |
E_ALL | 8191 | جميع الأخطاء والإخطارات، باستثناء E_STRICT قبل PHP 5.4.0. |
للحصول على مستويات أخطاء إضافية، يرجى الرجوع إلىمستويات الأخطاء في PHPالمرجع.
عندما يواجه سكربت PHP مشكلة، يُشغل محرك PHP الخطأ، ولكن يمكنك أيضًا إشعال الخطأ بنفسك لإنشاء رسائل خطأ أكثر تفاعلية للمستخدم. بهذا الشكل، يمكنك جعل التطبيق أكثر تعقيدًا. يلي بعض الطرق الشائعة لمعالجة أخطاء PHP:
اعمل على مثال يهدف فقط إلى فتح ملف نصي بصيغة فقط للقراءة.
<?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
كما ترونه، رسالة الخطأ التي تم إنشاؤها في المثال الثاني توضح المشكلة بشكل أوضح مقارنة بالمثال السابق.