بسم الله الرحمن الرحيم
يصعب كثيراً لدى المبرمجين تتبع سير البرنامج لأجل تصيُّد الأخطاء لأن رسائل الخطأ لا يعول عليها دائما في إظهار الخطأ .
فأحياناً يكون البرنامج ليس فيه خطأ من ناحية الصياغة اللغوية وأيضاً خالٍ من الأخطاء القاتلة التي تتعلق بالتعامل بمصادر البيانات , ولكنه يعطي نتائج غير متوقعة بسبب بعض الهنات هنا وهناك يغفل عنها المبرمج .
ولذلك لجأ الكثير منهم بإضافة ( debuging ) وتعني - كما أفهم من التطبيق وليس من الترجمة - : تتبع أخطاء البرنامج ومعرفة مصدر الخطأ من أين بسرد كل متغيرات البرنامج ونتائج الإجراءات .
ويهدف هذا الموضوع عرض الأخطاء مع عرض كل متغيرات البرنامج ونتائج الإجراءات يعني سير البرنامج ككل وبأخطاءه إن وجدت.
أما بنسبة لعرض الأخطاء الصادرة عن بيئة PHP فقد سبق في هذا المنتدى موضوع للأستاذ : الحسين علي المشرف السابق وبعنوان : (تعقب الأخطاء error tracing, إسلوب أفضل لعرض الأخطاء) وهو يتحدث عن إظهار الأخطاء بمظهر يساعد على تصحيحها وهو جهد مشكور وغير مسبوق إليه فجزاه الله خيراً .
ولقد استفدت منه كثيراً وأدخلته ضمن الملفات مع بعض التعديلات الطفيفة .
وأما بنسبة لعرض متغيرات ونتائج الإجراءات فاستخدمت دوال من موقع Zend
http://www.zend.com/zend/tut/tutorial-Debu...nc=0&view=1
http://www.zend.com/codex.php?id=876&single=1
ثم استخلص هذه الدالة البسيطة في فكرتها debug_var .
وتكمن الفكرة بإضافة الدالة debug_var عند كل ما تريد مراقبته وتأخذ وسيطين (arguments) اسم المتغير الذي تريده أن يظهر باسمه لتميزه عن غيره، والثاني قيمته التي تريد معرفتها .
مثال :
debug_var ('SESSION', $_SESSION);
س: إذاً ستفضحنا هذه الدالة وستظهر أسرارنا أمام الملأ ؟؟
هذه وظيفتك أيها المبرمج ، وهذه الدالة لا تعمل إلا إذا طلبت منها العمل حيث تفحص قيمة متغير عام في البرنامج ( $HAS_DEBUG ) أنت من تحدد قيمته مثال :
$HAS_DEBUG = $_GET['debug'] ? $_GET['debug'] : 0;
أوما شابه ذلك كل مبرمج بطريقته . وإذا جعلتها تعمل بدون فحص المتغير فإنه لا شك ستبطئ عمل البرنامج وأنت لا يحتاج إليها كل وقت .
س: إذا ظهر في البرنامج خطأ يوقفه بحيث لا يمكن معرفة نتائج هذه الدالة كيف نعمل ؟
هذه الدالة لما تبدأ في تسجيل الأخطاء والمتغيرات فإنها لا تنتظر حتى ينتهي البرناج كي تعرض نتيجة عملها وإنما تبدأ بإنشاء الملف debug.html عند بداية البرنامج وتسجل كل خطأ فيه عن طريق فتحة كل مره والإلحاق فيه .
فإذا توقف البرنامج عند خطأ فإنك ستعرف أين هو - وهذا هو بيت القصيد والمهم في الموضوع - فعند استعراض الملف debug.html يظهر آخر فحص لها والخطأ يكون بعدها مباشرة .
س: إذاً ستتراكم الأخطاء والمتغيرات عند كل مرة تفتح الصفحة وسيتضخم حجم الملف ؟
ج: تجاوت الدالة هذه المشكلة بفحص متغير $debugCount حيث تكون قيمة بداية الصفحة صفر ( 0 ) وعندها ستكتب على بيانات الملف السابق بهذ الاسم ثم تزيد العداد $debugCount++; وبعدها تلحق المدخلات آخر الملف .
س: إلى أي مدى يمكنني معرفته عن برنامجي ؟ ! ؟
ج: كل شيء وهذا يتطلب بعض الخبرة بدوال php فستطيع أن تراقب المصفوفات ، الكائنات ( class ) ، الدوال ، متغيرات البيئة ، وغيرها .
وهذا مسرد بما هو مهم منها :
get_included_files // تسرد لك جميع الملفات التي استخدمتها
get_magic_quotes_gpc // هل حماية الرموز بالشرطات مفعل
method_exists // ما هي نتيجة عمل الإجراء ضمن كائن معين
func_get_args // مسرد بالبرامترات وقيمها
get_object_vars // تسرد لك جميع متغيرات الكائن على شكل مصفوفة
get_declared_classes // لا يفيدك كثيراً فهو يعطيك كل الكائنات حتى التي في بيئة php ولم تستخدمها
get_defined_functions // أيضاً لا يفيد كثيراً إلا إذا حدد [user] يعني التي أنت صرحت بها
memory_get_usage // لم يعمل معي ويعطيك حجم الذاكرة المستخدمة وهنا بديل عنه باستخدام getmypid(); راجع ملفات المساعدة لـ memory_get_usage
apache_request_headers // مسرد بالرؤوس المرسلة من المتصفح
تنبيه الدالة error_log تقوم بعمل الدالة debug_vars ولكنها لا تتيح لك المراقبة المتكاملة ولكنها تصلح أن تستخدمها بعد الإنتهاء من البرمجة وتعمل دوماً وبلا شرط في الأخطاء القاتلة والحرجة يعني ممكن أن تضيفها في موقع إنتاجي للدالة CustomErrorHandler إذا كان الخطأ حرجاً يعني ليس ملاحظة أو تحذير أو خطأ إعرابي .
وإذا استخدمت error_log فإن لها خيارات بإرسال الخطأ إلى بريد أو إلى ملف أو إلى موقع .
هذه أكثر الدوال المهمة التي تتعلق بمراقبة سير البرنامج وهنا معلومات تستطيع معرفتها عن استعراض الملف phpinfo.php المعروف .
وأرجوا من الأخوان أن يدلونا على دوال أخرى مهمة ، أو طرائق جديدة .
في المرفقات : مثال مع بعض الهدايا العيدية ويحتوي على الملفات التالية :
كائن بسيط للإتصال بقاعدة بيانات mySQL والتعامل معه
كائن نظام القوالب TemplatePower مع مثال عليه وكيف نستخدم debug معه .
الملف : customerrorviewer.php للاستاذ الحسين علي بارك الله فيه، مع بعض التعديلات الطفيفة عليه .
الملف : function.php وبه بعض الدوال المتعلقة بالمثال .
وملف index.php الذي تستطيع أن تعبث به كما شئت لكي تسبر أغوار هذه الطريقة .
وفي الختام أسأل الله أن يكون هذا العمل المتواضع خالصاً لوجه ، وأن يبارك لنا فيه ، وأسألكم ألا تبخلوا بذكر الأخطاء في هذا الموضوع وإثراءه بأفكاركم .
