การดีบัก PHP - วิธีการดีบักโค้ด PHP ของคุณ (รวมเทคนิคการดีบัก Drupal ด้วย!)

เผยแพร่แล้ว: 2019-09-03

การดีบักไม่ใช่สิ่งที่เรานักพัฒนาตั้งตารอ นักพัฒนาไม่ชอบบั๊กแต่เพื่อที่จะสามารถสร้างซอฟต์แวร์คุณภาพดีได้ การดีบั๊กเป็นส่วนสำคัญของชีวิตของนักพัฒนา นักพัฒนา PHP ทุกคนมีสไตล์และวิธีการใช้งานที่แตกต่างกันสำหรับการดีบักโค้ดของตน ขึ้นอยู่กับประสบการณ์ของพวกเขา วิธีการแก้ปัญหาของพวกเขา และที่สำคัญที่สุด - ระยะเวลาที่พวกเขามีอยู่!

การดีบักสำคัญแค่ไหน และทำไมคุณต้องดีบั๊กโค้ดของคุณ?

การดีบักเป็นส่วนสำคัญของวงจรการพัฒนาซอฟต์แวร์ที่รับประกันผลลัพธ์ที่มีคุณภาพ
ลองนึกภาพสิ่งนี้ - ฐานรหัสมีขนาดใหญ่ คุณเพิ่งเริ่มโครงการ คุณไม่มีรายละเอียดของโครงการ/ฟังก์ชันการทำงานมากนัก แต่คุณควรแก้ไขข้อผิดพลาด เราจะเริ่มจากที่ไหน? เราเริ่มต้นด้วยการวิเคราะห์โค้ดทีละขั้นตอนเพื่อทำความเข้าใจว่าทำอะไรเสร็จแล้วและมีอะไรผิดพลาด เพื่อนของฉันกำลังดีบั๊ก การดีบักเป็นศิลปะที่สามารถพัฒนาให้ดีขึ้นได้ด้วยการฝึกฝนและประสบการณ์

วิธีดีบักโค้ด PHP ของคุณ

โอเค นี่เป็นกรณีที่ฉันได้เจอในสายงานการพัฒนาของฉัน มีไซต์การค้าที่สร้างขึ้นบน Wordpress ซึ่งกระบวนการเช็คเอาต์ใช้เวลาประมาณ 5-8 นาที และฉันถูกขอให้แก้ไข ในกรณีนี้ ฉันไม่มีความรู้เกี่ยวกับวิธีการทำงานของ Wordpress มากนัก ดังนั้นฉันจึงเริ่มต้นด้วยการตรวจสอบตัวเลือกจากรายการทีละรายการเช่น (a) เป็นเพราะปลั๊กอินบางตัวหรือไม่? (b) เป็นธีมที่เกี่ยวข้องหรือไม่? (c) เป็นฐานรหัสที่กำหนดเองหรือไม่? ฯลฯ

เครื่องมือที่ช่วยฉันในการดีบัก php และแก้ไขกรณีนี้คือ Blackfire วิธีนี้ช่วยให้คุณมีตัวเลือกที่ผู้ใช้อ่านได้ง่ายขึ้นสำหรับการติดตามสแต็กของฟังก์ชันทั้งหมด เวลาที่ใช้สำหรับแต่ละฟังก์ชันในกระบวนการทั้งหมด เมื่อใช้สิ่งนี้ ฉันพบฟังก์ชันที่กินขั้นตอนการชำระเงินจนหมด สิ่งที่คุณต้องมีคือการตั้งค่าบางอย่างเพื่อเพิ่มคีย์ลงในฐานโค้ดของคุณ และคุณพร้อมที่จะวิเคราะห์ฟังก์ชันใดๆ โดยใช้เอกสารประกอบ
ดังนั้น คุณสามารถแก้ไขจุดบกพร่องได้ หากคุณมีความรู้เกี่ยวกับวิธีการดีบัก php หลายวิธี

เทคนิคการแก้จุดบกพร่องโค้ด

ให้ฉันพูดถึงเทคนิคบางอย่างที่ฉันใช้ในการดีบั๊ก PHP
วิธีที่ง่ายและธรรมดาที่สุดในการตรวจสอบว่ามีการเรียกใช้ฟังก์ชันหรือวิธีการที่คุณเขียนหรือไม่ ให้เขียน exit คงไม่มีนักพัฒนาคนไหนที่ไม่ได้ใช้สิ่งนี้!
ในการตรวจสอบค่าของตัวแปรบางตัว print_r(), var_dump(), var_export() โอเค มาดูความแตกต่างกัน

ตัวอย่าง:

 สมมติอาร์เรย์ 
$a = array( 1, array( "a", "b") );
print_r($a);

 
Array
(
[ 0 ] => 1
[ 1 ] => Array
(
[ 0 ] => 'เอ'
[ 1 ] => 'ข'
)
)

สิ่งนี้ให้รูปแบบและข้อมูลเกี่ยวกับตัวแปรที่มนุษย์สามารถอ่านได้ นอกจากนี้เรายังสามารถเก็บไว้ในตัวแปรด้วย print_r($var, true)

 var_dump( $a );
 อาร์เรย์ ( 3 ) {
[ 0 ]=>
int( 1 )
[ 1 ]=>
  อาร์เรย์ ( 2 ) {
[ 0 ]=>
สตริง ( 1 ) "a"
[ 1 ]=>
สตริง( 1 ) "b"
}
}

ซึ่งจะพิมพ์ตามชนิด ความยาวของแต่ละค่า และเร็วกว่าเมื่อเปรียบเทียบกับ print_r()
var_export( $a );

 อาร์เรย์ (
  0 => 1 ,
  1 =>
  อาร์เรย์ (
    0 => 'เอ' ,
    1 => 'b' ,
),
)

ซึ่งจะพิมพ์ตามชนิด ความยาวของแต่ละค่า และเร็วกว่าเมื่อเปรียบเทียบกับ print_r()
var_export( $a );

ส่งคืน php ที่ถูกต้อง หากมีตัวแปร มิฉะนั้นจะคืนค่า เท็จ ซึ่งหมายความว่า เอาต์พุตของ var_export สามารถใช้ได้โดยตรงในไฟล์ php

คุณเคยใช้ debug($var, NULL, TRUE) โดย Drupal core หรือไม่? สิ่งนี้ใช้ print_r() หรือ var_export ตามอาร์กิวเมนต์ที่ส่งไปยังฟังก์ชันดีบัก php

แล้วคำเตือนด้านล่างล่ะ ซึ่งคุณไม่รู้ว่าโค้ดบรรทัดใดทำให้เกิดคำเตือนดังกล่าว

คำเตือน: ระบุอาร์กิวเมนต์ไม่ถูกต้องสำหรับ foreach() ใน /modules/node/node.module on line 485

เรารู้ว่ามีหลายสถานที่ที่จะเรียกโมดูลโหนด ดังนั้นคุณจะแก้ปัญหานี้อย่างไร? วิธีหนึ่งที่เร็วกว่าโดยไม่ต้องใช้ทรัพยากรภายนอกอื่นใดคือการใช้ฟังก์ชัน PHP debug_backtrace() ไปที่ “drupal_set_message” เพราะคุณรู้ว่านี่คือวิธีการพิมพ์คำเตือน ใส่บรรทัดด้านล่างในฟังก์ชันนั้น

debug_backtrace();

เอาท์พุท:

Array
(
[ 0 ] => Array
(
[file] => /includes/common.inc
[line] => 552
[ ฟังก์ชั่น ] => drupal_set_message
[ args ] => Array
(
[ 0 ] => คำเตือน: Invalid

อาร์กิวเมนต์ที่ให้ไว้สำหรับ foreach() ใน

/modules/node/node.module ในบรรทัด 504
[ 1 ] => error
)

)

[1] => Array
(
[ไฟล์] => /modules/node/node.module
[line] => 504
[ฟังก์ชัน] => error_handler
[args] => Array
(
[ 0 ] => 2
[ 1 ] => อาร์กิวเมนต์ไม่ถูกต้อง
จัดให้ foreach()
[ 2 ] => /modules/node/
node.module
[ 3 ] => 504
[ 4 ] => Array
(
[พารามิเตอร์] =>
[แก้ไข] =>
[รีเซ็ต] =>
...
)

)

)

[2] => อาร์เรย์
(
[file] => /sites/all/modules/custom/custom_module
/custom_module.module
[line] => 10
[ฟังก์ชัน] => node_load
[args] => Array
(
[ 0 ] =>
)

)

[3] => Array
(
[file] => /includes/form.inc
[line] => 365
[ฟังก์ชัน] => custom_module_form_alter
[args] => Array
(
...

ฟังก์ชันนี้แสดงสแต็กของฟังก์ชันทั้งหมดที่ถูกเรียกในกระบวนการที่ทำให้เกิดการเตือน ตรวจสอบให้แน่ใจว่าคุณจำกัดขีดจำกัด มิฉะนั้น PHP จะแสดงข้อความ "หน่วยความจำหมด" หากสแต็กใช้เวลานานเกินไปในการแสดง

การดีบักผ่าน CLI:

เคยได้ยิน phpdbg ! ใช่ มีนามสกุล php ที่พร้อมใช้งานจาก PHP 5.6+ ซึ่งใช้ในการดีบักไฟล์ php จากบรรทัดคำสั่ง
เปิดเทอร์มินัลของคุณ ป้อน "phpdbg" สิ่งนี้จะเริ่มต้นเชลล์ดีบักเกอร์ php แบบโต้ตอบ คุณสามารถใช้เบรกพอยต์ได้! ลองเลย - วิธีซ่อนการดีบัก PHP
ปัญหาเดียวคือ คุณจะต้องทำความคุ้นเคยกับคำสั่งของ phpdbg เพื่อให้ใช้งานได้ดียิ่งขึ้น

การดีบักผ่าน Drupal:

Devel Kint: นักพัฒนา Drupal ใช้สิ่งนี้ค่อนข้างบ่อย Kint เป็นโมดูลย่อยของโมดูล Devel ที่สามารถใช้ในการดีบักเทมเพลตทวิก Drupal 8 ร่วมกับ dump();

บันทึกฐานข้อมูล: ใครบ้างที่ไม่รู้จักโมดูล Drupal นี้! ใน D7 มันคือ watchdog() และ D8 เป็น บริการ logger

\Drupal::logger( 'my_module' )->debug($message);

แต่เหตุผลเดียวที่เราไม่สนับสนุนให้ใช้โมดูลนี้แม้ว่าเราจะชอบสิ่งนี้ก็คือข้อความบันทึกจะถูกเขียนลงในฐานข้อมูลทุกครั้ง!

และลองนึกภาพว่าถ้าเป็นฐานข้อมูลขนาดใหญ่ มันจะยิ่งแย่ลงไปอีกและจะส่งผลต่อประสิทธิภาพการทำงาน นั่นเป็นเหตุผล จึงไม่แนะนำให้ใช้โมดูล DBLOG บนไซต์การผลิต
คุณยังต้องการใช้ DBLog โมดูลและลดผลกระทบต่อประสิทธิภาพหรือไม่ มีวิธีแก้ไขเช่นกัน - ตัวกรอง DBlog นี่เป็นโมดูลที่สนับสนุนซึ่งช่วยในการจำกัดประเภทของบันทึกที่จะเขียนลงในฐานข้อมูล ตัวอย่างเช่น หากคุณต้องการจัดเก็บเฉพาะบันทึกของ "ข้อผิดพลาด" ที่มีความรุนแรง คุณสามารถกำหนดค่าได้โดยใช้โมดูลนี้ ดังนั้นคุณจึงไม่ต้องกำจัดโมดูล Dblog โดยสิ้นเชิง ใช่แล้วโมดูลนี้สนับสนุนโดยฉัน ;)

ผู้สร้างโปรไฟล์เว็บ

Web profiler เป็นโมดูลที่สนับสนุนโดย Devel อีกครั้ง เมื่อคุณเปิดใช้งานโมดูลแล้ว คุณจะเห็นรายงานที่ด้านล่างของหน้าต่าง เมื่อใดก็ตามที่มีการโหลดหน้า รายงานนี้จะให้เวลาในการโหลดหน้าเว็บ จำนวนการสืบค้นที่ทำงานอยู่ในหน้า จำนวนแบบฟอร์ม จำนวนไฟล์ js/css ฯลฯ ในหน้านั้น

ผู้สร้างโปรไฟล์เว็บ

ใช่ สิ่งนี้ยังให้รายละเอียดของแต่ละส่วนโดยคลิกที่ส่วนเหล่านั้น ตัวอย่างเช่น รูปภาพต่อไปนี้แสดงการสืบค้นข้อมูลในโฮมเพจ

Xdebug

XDebug - การดีบักผ่าน IDE:

วิธีที่ดีที่สุดและเป็นมิตรกับผู้ใช้ในการดีบักคนส่วนใหญ่ชอบถ้าพวกเขาใช้ IDE สำหรับการเข้ารหัสคือการใช้ XDebug XDebug เป็นส่วนขยายของ PHP ที่ช่วยในการพัฒนาและการดีบัก และจัดเตรียมดีบักเกอร์ขั้นตอนเดียวที่คุณสามารถใช้กับ IDE เช่น PHPStorm แน่นอนว่าเพื่อให้ได้ผลลัพธ์ที่ดีที่สุด คุณต้องพยายามมากขึ้นในการติดตั้งและกำหนดค่าส่วนขยายด้วย IDE ที่คุณใช้อยู่