การดีบัก 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 ![]() อาร์กิวเมนต์ที่ให้ไว้สำหรับ foreach() ใน /modules/node/node.module ในบรรทัด 504 |
ฟังก์ชันนี้แสดงสแต็กของฟังก์ชันทั้งหมดที่ถูกเรียกในกระบวนการที่ทำให้เกิดการเตือน ตรวจสอบให้แน่ใจว่าคุณจำกัดขีดจำกัด มิฉะนั้น 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 - การดีบักผ่าน IDE:
วิธีที่ดีที่สุดและเป็นมิตรกับผู้ใช้ในการดีบักคนส่วนใหญ่ชอบถ้าพวกเขาใช้ IDE สำหรับการเข้ารหัสคือการใช้ XDebug XDebug เป็นส่วนขยายของ PHP ที่ช่วยในการพัฒนาและการดีบัก และจัดเตรียมดีบักเกอร์ขั้นตอนเดียวที่คุณสามารถใช้กับ IDE เช่น PHPStorm แน่นอนว่าเพื่อให้ได้ผลลัพธ์ที่ดีที่สุด คุณต้องพยายามมากขึ้นในการติดตั้งและกำหนดค่าส่วนขยายด้วย IDE ที่คุณใช้อยู่

