تصحيح أخطاء PHP - كيفية تصحيح كود PHP الخاص بك (تتضمن تقنيات تصحيح Drupal!)

نشرت: 2019-09-03

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

ما مدى أهمية تصحيح الأخطاء ولماذا تحتاج إلى تصحيح التعليمات البرمجية الخاصة بك؟

تصحيح الأخطاء هو جزء لا يتجزأ من دورة حياة تطوير البرامج التي تضمن نتائج عالية الجودة.
تخيل هذا - قاعدة الشفرة كبيرة ، أنت جديد في المشروع ، وليس لديك الكثير من التفاصيل عن المشروع / الوظيفة. لكن من المفترض أن تصلح الخلل. من أين نبدأ؟ نبدأ بتحليل الكود خطوة بخطوة لفهم ما تم فعله وأين تسوء الأمور. هذا ، يا أصدقائي ، هو تصحيح الأخطاء. التصحيح هو فن يمكن أن يتحسن بالممارسة والخبرة.

كيفية تصحيح كود PHP الخاص بك

حسنًا ، هذه حالة صادفتها في مسيرتي التنموية. يوجد موقع تجاري مبني على Wordpress حيث كانت عملية السداد تستغرق حوالي 5-8 دقائق وطُلب مني حلها. في هذه الحالة ، ليس لدي الكثير من المعرفة حول كيفية عمل الأشياء مع Wordpress. لذلك بدأت بفحص الخيارات من القائمة واحدًا تلو الآخر مثل ، (أ) هل هو بسبب بعض المكونات الإضافية؟ (ب) هل الموضوع متعلق؟ (ج) هل هي أي قاعدة رمز مخصص؟ إلخ.

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

تقنيات تصحيح التعليمات البرمجية

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

مثال:

 افترض مصفوفة 
$ a = مجموعة (1، مجموعة ("أ"، "ب"))؛
print_r ($ a) ؛

 
مجموعة مصفوفة
(
[ 0 ] => 1
[ 1 ] => صفيف
(
[ 0 ] => "أ"
[ 1 ] => "ب"
)
)

يعطي هذا تنسيقًا يمكن قراءته ومعلومات حول المتغير. أيضًا ، يمكننا تخزينه في متغير باستخدام print_r ($ var ، true).

 var_dump ($ a) ؛
 مجموعة ( 3 ) {
[ 0 ] =>
انت ( 1 )
[ 1 ] =>
  مجموعة ( 2 ) {
[ 0 ] =>
سلسلة ( 1 ) "أ"
[ 1 ] =>
سلسلة ( 1 ) "ب"
}
}

هذا يطبع مع نوع وطول كل قيمة. وهذا أسرع مقارنةً بـ print_r ()
var_export ($ a) ؛

 مجموعة (
  0 => 1 ،
  1 =>
  مجموعة (
    0 => "أ" ،
    1 => "ب" ،
) ،
)

هذا يطبع مع نوع وطول كل قيمة. وهذا أسرع مقارنةً بـ print_r ()
var_export ($ a) ؛

هذا يعيد php صالحًا ، إذا كان المتغير موجودًا ، وإلا فإنه يُرجع خطأ. مما يعني أنه يمكن استخدام إخراج var_export مباشرة في ملف php.

هل سبق لك أن استخدمت التصحيح (var $، NULL، TRUE) المقدم من Drupal core؟ يستخدم هذا print_r () أو var_export بناءً على الوسائط التي تم تمريرها إلى وظيفة تصحيح الأخطاء php.

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

تحذير: تم توفير وسيطة غير صالحة لـ foreach () في /modules/node/node.module في السطر 485 .

نحن نعلم أن هناك العديد من الأماكن التي سيتم استدعاء وحدة العقدة فيها. لذا ، كيف تحل هذا؟ هناك طريقة أسرع بدون استخدام أي موارد خارجية أخرى وهي استخدام دالة PHP debug_backtrace () . انتقل إلى "drupal_set_message" ، لأنك تعلم أن هذه هي الطريقة التي تقوم بطباعة التحذير. ضع السطر أدناه ، في هذه الوظيفة

debug_backtrace () ،

انتاج:

مجموعة مصفوفة
(
[ 0 ] => صفيف
(
[ملف] => /includes/common.inc
[سطر] => 552
[ وظيفة ] => drupal_set_message
[ args ] => صفيف
(
[ 0 ] => تحذير: غير صالح

تم توفير الوسيطة لـ foreach () في

/modules/node/node.module في السطر 504.
[ 1 ] => خطأ
)

)

[1] => صفيف
(
[ملف] => /modules/node/node.module
[سطر] => 504
[وظيفة] => معالج الأخطاء
[args] => صفيف
(
[ 0 ] => 2
[ 1 ] => وسيطة غير صالحة
تم توفيره لكل شخص ()
[ 2 ] => / modules / node /
العقدة
[ 3 ] => 504
[ 4 ] => صفيف
(
[بارام] =>
[مراجعة] =>
[إعادة] =>
...
)

)

)

[2] => صفيف
(
[ملف] => / sites / all / modules / custom / custom_module
/custom_module.module
[سطر] => 10
[وظيفة] => node_load
[args] => صفيف
(
[ 0 ] =>
)

)

[3] => صفيف
(
[ملف] => /includes/form.inc
[سطر] => 365
[وظيفة] => custom_module_form_alter
[args] => صفيف
(
...

تُظهر هذه الوظيفة كومة جميع الوظائف التي تم استدعاؤها في عملية التسبب في التحذير. تأكد من تقييد الحد ، وإلا ستظهر PHP رسالة "استنفدت الذاكرة" إذا استغرق المكدس وقتًا طويلاً ليتم عرضه.

التصحيح من خلال CLI:

سمعت عن phpdbg ! نعم ، هناك امتداد php متاح من PHP 5.6+ والذي يستخدم لتصحيح ملف php من سطر الأوامر.
افتح Terminal ، أدخل "phpdbg". يؤدي هذا إلى تشغيل قذيفة مصحح أخطاء php التفاعلية. يمكنك أيضًا استخدام نقاط التوقف! فقط جربه - الطريقة الخفية لتصحيح أخطاء PHP.
المشكلة الوحيدة هي: يجب أن تعتاد على أوامر phpdbg لتستفيد منها بشكل أفضل.

التصحيح من خلال دروبال:

Devel Kint: يستخدم مطورو Drupal هذا كثيرًا. Kint هي وحدة فرعية من وحدة Devel التي يمكن استخدامها لتصحيح أخطاء قوالب غصين Drupal 8 مع dump () ؛

سجل قاعدة البيانات: من ليس على علم بوحدة دروبال هذه ؟! في D7 هو watchdog () و D8 هو خدمة المسجل.

\ Drupal :: logger ( 'my_module' ) -> تصحيح (رسالة $) ؛

لكن السبب الوحيد الذي يجعلنا لا نشجع استخدام هذه الوحدة على الرغم من أننا نحبها هو أن رسالة السجل تُكتب في قاعدة البيانات في كل مرة!

وتخيل لو كانت قاعدة بيانات ضخمة ، فسيكون هذا أسوأ وسيؤثر على الأداء. لهذا السبب ، لا يوصى باستخدام وحدة DBLOG في مواقع الإنتاج.
هل ما زلت ترغب في استخدام DBLog والوحدة النمطية وتقليل تأثيرات الأداء؟ هناك حل لذلك أيضًا - عامل تصفية DBlog. هذه وحدة مساهمة تساعد في تقييد نوع السجلات المراد كتابتها في قاعدة البيانات. على سبيل المثال ، إذا كنت تريد تخزين سجلات الخطورة "خطأ" فقط ، فيمكنك تهيئتها باستخدام هذه الوحدة. لذلك ليس عليك التخلص تمامًا من وحدة Dblog . أوه نعم ، وقد ساهمت في هذه الوحدة ؛)

ملف تعريف الويب

ملف تعريف الويب هو وحدة نمطية ساهمت بها Devel مرة أخرى. بمجرد تمكين الوحدة ، سترى تقريرًا في أسفل النافذة. عندما يتم تحميل صفحة ، يعطينا هذا التقرير وقت تحميل الصفحة ، وعدد الاستعلامات التي يتم تشغيلها في الصفحة ، وعدد النماذج ، وعدد ملفات js / css ، وما إلى ذلك في تلك الصفحة.

ملف تعريف الويب

نعم ، هذا يوفر حتى تفاصيل كل قسم من خلال النقر عليها. على سبيل المثال ، تُظهر الصورة التالية الاستعلامات في الصفحة الرئيسية.

Xdebug

XDebug - التصحيح من خلال IDE:

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