ใน PHP การจัดการข้อผิดพลาดเริ่มต้นนั้นทำได้ง่าย ข้อความแสดงข้อผิดพลาดจะถูกส่งไปยังเบราว์เซอร์พร้อมชื่อไฟล์ หมายเลขบรรทัด และข้อความที่อธิบายข้อผิดพลาด
การจัดการข้อผิดพลาดเป็นส่วนสำคัญในการสร้างสคริปต์และเว็บแอปพลิเคชัน หากโค้ดของคุณขาดการเข้ารหัสการตรวจจับข้อผิดพลาด โปรแกรมจะดูไม่เป็นมืออาชีพและเปิดประตูสู่ความเสี่ยงด้านความปลอดภัย
บทช่วยสอนนี้จะแนะนำวิธีการตรวจจับข้อผิดพลาดที่สำคัญที่สุดใน PHP
เราจะอธิบายวิธีการจัดการข้อผิดพลาดต่างๆ ให้กับคุณ:
คำสั่ง "die()" อย่างง่าย
ข้อผิดพลาดที่กำหนดเองและทริกเกอร์ข้อผิดพลาด
รายงานข้อผิดพลาด
ตัวอย่างแรกแสดงสคริปต์ง่ายๆ ที่เปิดไฟล์ข้อความ:
<?php$file=fopen("welcome.txt","r");?>
หากไม่มีไฟล์ดังกล่าว คุณจะได้รับข้อผิดพลาดดังนี้:
คำเตือน: fopen(welcome.txt) [function.fopen]: ไม่สามารถเปิดสตรีม:ไม่มีไฟล์หรือไดเรกทอรีดังกล่าวใน /www/codercto/test/test.php ออนไลน์ 2
เพื่อหลีกเลี่ยงไม่ให้ผู้ใช้ได้รับข้อความแสดงข้อผิดพลาดดังที่กล่าวมาข้างต้น เราจะตรวจสอบว่ามีไฟล์อยู่หรือไม่ก่อนที่จะเข้าถึง:
<?phpif(!file_exists("welcome.txt")){ die("ไม่มีไฟล์");}else{ $file=fopen("welcome.txt","r");}?>
ตอนนี้หากไม่มีไฟล์อยู่ คุณจะได้รับข้อความแสดงข้อผิดพลาดดังนี้:
ไม่มีไฟล์อยู่
โค้ดด้านบนมีประสิทธิภาพมากกว่าโค้ดก่อนหน้าเนื่องจากใช้กลไกการจัดการข้อผิดพลาดอย่างง่ายเพื่อยุติสคริปต์หลังจากเกิดข้อผิดพลาด
อย่างไรก็ตาม การยกเลิกสคริปต์เพียงอย่างเดียวอาจไม่เหมาะสมเสมอไป เรามาตรวจสอบฟังก์ชันทางเลือก PHP ในการจัดการข้อผิดพลาดกัน
การสร้างตัวจัดการข้อผิดพลาดแบบกำหนดเองนั้นง่ายมาก เราเพียงแค่สร้างฟังก์ชันเฉพาะที่สามารถเรียกใช้ได้เมื่อเกิดข้อผิดพลาดใน PHP
ฟังก์ชันจะต้องสามารถจัดการพารามิเตอร์ได้อย่างน้อยสองตัว (ระดับข้อผิดพลาดและข้อความแสดงข้อผิดพลาด) แต่สามารถรับพารามิเตอร์ได้สูงสุดห้าตัว (ตัวเลือก: ไฟล์ หมายเลขบรรทัด และบริบทข้อผิดพลาด):
error_function(error_level,error_message,error_file,error_line,error_context)
พารามิเตอร์ | อธิบาย |
---|---|
error_level | ที่จำเป็น. ระบุระดับการรายงานข้อผิดพลาดสำหรับข้อผิดพลาดที่ผู้ใช้กำหนด ต้องเป็นตัวเลข ดูตารางด้านล่าง: ระดับการรายงานข้อผิดพลาด |
ข้อผิดพลาด_ข้อความ | ที่จำเป็น. ระบุข้อความแสดงข้อผิดพลาดสำหรับข้อผิดพลาดที่ผู้ใช้กำหนด |
error_file | ไม่จำเป็น. ระบุชื่อไฟล์ที่เกิดข้อผิดพลาด |
error_line | ไม่จำเป็น. ระบุหมายเลขบรรทัดที่เกิดข้อผิดพลาด |
error_context | ไม่จำเป็น. ระบุอาร์เรย์ที่มีตัวแปรแต่ละตัวที่ใช้งานเมื่อเกิดข้อผิดพลาดและค่าของตัวแปรเหล่านั้น |
ระดับการรายงานข้อผิดพลาดเหล่านี้เป็นข้อผิดพลาดประเภทต่างๆ ที่จัดการโดยตัวจัดการข้อผิดพลาดที่ผู้ใช้กำหนด:
ค่า | คงที่ | อธิบาย |
---|---|---|
2 | E_คำเตือน | ข้อผิดพลาดรันไทม์ที่ไม่ร้ายแรง อย่าหยุดการทำงานของสคริปต์ชั่วคราว |
8 | E_ประกาศ | การแจ้งเตือนรันไทม์ เกิดขึ้นเมื่อสคริปต์พบข้อผิดพลาดที่เป็นไปได้ แต่ก็สามารถเกิดขึ้นเมื่อสคริปต์ทำงานตามปกติเช่นกัน |
256 | E_USER_ERROR | ข้อผิดพลาดร้ายแรงที่ผู้ใช้สร้างขึ้น สิ่งนี้คล้ายกับ E_ERROR ที่โปรแกรมเมอร์ตั้งค่าโดยใช้ฟังก์ชัน PHP trigger_error() |
512 | E_USER_WARNING | คำเตือนที่ไม่ร้ายแรงที่ผู้ใช้สร้างขึ้น สิ่งนี้คล้ายกับ E_WARNING ที่กำหนดโดยโปรแกรมเมอร์โดยใช้ฟังก์ชัน PHP trigger_error() |
1,024 | E_USER_ประกาศ | การแจ้งเตือนที่ผู้ใช้สร้างขึ้น สิ่งนี้คล้ายกับ E_NOTICE ที่กำหนดโดยโปรแกรมเมอร์โดยใช้ฟังก์ชัน PHP trigger_error() |
4096 | E_RECOVERABLE_ERROR | ข้อผิดพลาดร้ายแรงที่ดักจับได้ เช่นเดียวกับ E_ERROR แต่สามารถจับได้โดยตัวจัดการที่ผู้ใช้กำหนด (ดูที่ set_error_handler()) |
8191 | อี_ออล | ข้อผิดพลาดและคำเตือนทั้งหมด (ใน PHP 5.4 E_STRICT จะกลายเป็นส่วนหนึ่งของ E_ALL) |
ตอนนี้ เรามาสร้างฟังก์ชันที่จัดการกับข้อผิดพลาดกันดีกว่า:
ฟังก์ชั่น customError($errno, $errstr){ echo "<b>ข้อผิดพลาด:</b> [$errno] $errstr<br>"; echo "สิ้นสุดสคริปต์";
โค้ดด้านบนเป็นฟังก์ชันการจัดการข้อผิดพลาดอย่างง่าย เมื่อมีการทริกเกอร์ จะได้รับระดับข้อผิดพลาดและข้อความแสดงข้อผิดพลาด จากนั้นจะพิมพ์ระดับข้อผิดพลาดและข้อความ และยุติสคริปต์
ตอนนี้เราได้สร้างฟังก์ชันการจัดการข้อผิดพลาดแล้ว เราต้องพิจารณาว่าจะเริ่มทำงานเมื่อใด
ตัวจัดการข้อผิดพลาดเริ่มต้นของ PHP คือตัวจัดการข้อผิดพลาดในตัว เราจะแปลงฟังก์ชันข้างต้นเป็นตัวจัดการข้อผิดพลาดเริ่มต้นเมื่อสคริปต์กำลังทำงาน
ตัวจัดการข้อผิดพลาดสามารถแก้ไขได้เพื่อใช้กับข้อผิดพลาดบางอย่างเท่านั้น เพื่อให้สคริปต์สามารถจัดการกับข้อผิดพลาดที่แตกต่างกันแตกต่างกันได้ อย่างไรก็ตาม ในกรณีนี้ เราจะใช้เครื่องมือจัดการข้อผิดพลาดแบบกำหนดเองของเราสำหรับข้อผิดพลาดทั้งหมด:
set_error_handler("ข้อผิดพลาดแบบกำหนดเอง");
เนื่องจากเราต้องการให้ฟังก์ชันแบบกำหนดเองของเราจัดการกับข้อผิดพลาดทั้งหมด set_error_handler() จึงต้องการเพียงอาร์กิวเมนต์เดียวเท่านั้น และคุณสามารถเพิ่มอาร์กิวเมนต์ตัวที่สองเพื่อระบุระดับข้อผิดพลาดได้
ทดสอบตัวจัดการข้อผิดพลาดนี้โดยพยายามพิมพ์ตัวแปรที่ไม่มีอยู่:
<?php// ฟังก์ชันการจัดการข้อผิดพลาด function customError($errno, $errstr){ echo "<b>ข้อผิดพลาด:</b> [$errno] $errstr";}// ตั้งค่าฟังก์ชันการจัดการข้อผิดพลาด set_error_handler("customError") ;//ทริกเกอร์เกิดข้อผิดพลาด echo($test);?>
ผลลัพธ์ของโค้ดด้านบนมีลักษณะดังนี้:
ข้อผิดพลาด: [8] ตัวแปรที่ไม่ได้กำหนด: ทดสอบ
เมื่อผู้ใช้ป้อนข้อมูลในสคริปต์ จะมีประโยชน์ที่จะทำให้เกิดข้อผิดพลาดเมื่ออินพุตของผู้ใช้ไม่ถูกต้อง ใน PHP งานนี้สำเร็จได้ด้วยฟังก์ชัน trigger_error()
ในตัวอย่างนี้ หากตัวแปร "test" มากกว่า "1" แสดงว่าเกิดข้อผิดพลาด:
<?php$test=2;if ($test>1){ trigger_error("ค่าตัวแปรต้องน้อยกว่าหรือเท่ากับ 1");}?>
ผลลัพธ์ของโค้ดด้านบนมีลักษณะดังนี้:
หมายเหตุ: ค่าตัวแปรจะต้องน้อยกว่าหรือเท่ากับ 1in /www/test/codercto.php ที่บรรทัด 5
คุณสามารถทำให้เกิดข้อผิดพลาดได้ทุกที่ในสคริปต์ และด้วยการเพิ่มพารามิเตอร์ตัวที่สอง คุณสามารถระบุระดับข้อผิดพลาดที่จะถูกทริกเกอร์ได้
ประเภทข้อผิดพลาดที่เป็นไปได้:
E_USER_ERROR - ข้อผิดพลาดรันไทม์ที่ผู้ใช้สร้างขึ้นร้ายแรง ข้อผิดพลาดไม่สามารถกู้คืนได้ การเรียกใช้สคริปต์ถูกขัดจังหวะ
E_USER_WARNING - คำเตือนรันไทม์ที่ผู้ใช้สร้างขึ้นโดยไม่เป็นอันตราย การดำเนินการสคริปต์ไม่ถูกขัดจังหวะ
E_USER_NOTICE - ค่าเริ่มต้น การแจ้งเตือนรันไทม์ที่ผู้ใช้สร้างขึ้น เกิดขึ้นเมื่อสคริปต์พบข้อผิดพลาดที่เป็นไปได้ แต่ก็สามารถเกิดขึ้นได้เมื่อสคริปต์ทำงานตามปกติเช่นกัน
ในตัวอย่างนี้ หากตัวแปร "test" มากกว่า "1" จะเกิดข้อผิดพลาด E_USER_WARNING หาก E_USER_WARNING เกิดขึ้น เราจะใช้ตัวจัดการข้อผิดพลาดแบบกำหนดเองของเราและสิ้นสุดสคริปต์:
<?php// ฟังก์ชันการจัดการข้อผิดพลาด customError($errno, $errstr){ echo "<b>ข้อผิดพลาด:</b> [$errno] $errstr<br>"; echo "End of script"; }//ตั้งค่าฟังก์ชันการจัดการข้อผิดพลาด set_error_handler("customError",E_USER_WARNING);//Trigger error $test=2;if ($test>1){ trigger_error("ค่าตัวแปรต้องน้อยกว่าหรือเท่ากับ 1",E_USER_WARNING);}?>
ผลลัพธ์ของโค้ดด้านบนมีลักษณะดังนี้:
ข้อผิดพลาด: [512] ค่าตัวแปรต้องน้อยกว่าหรือเท่ากับ 1 จุดสิ้นสุดของสคริปต์
ตอนนี้เราได้เรียนรู้วิธีสร้างข้อผิดพลาดของเราเองและวิธีทริกเกอร์แล้ว มาดูการบันทึกข้อผิดพลาดกัน
ตามค่าเริ่มต้น PHP จะส่งบันทึกข้อผิดพลาดไปยังระบบบันทึกหรือไฟล์ของเซิร์ฟเวอร์ ขึ้นอยู่กับการกำหนดค่า error_log ใน php.ini โดยใช้ฟังก์ชัน error_log() คุณสามารถส่งบันทึกข้อผิดพลาดไปยังไฟล์ที่ระบุหรือปลายทางระยะไกลได้
การส่งอีเมลแจ้งข้อผิดพลาดถึงตัวคุณเองเป็นวิธีที่ดีในการรับการแจ้งเตือนข้อผิดพลาดที่ระบุ
ในตัวอย่างด้านล่าง หากมีข้อผิดพลาดเกิดขึ้น เราจะส่งอีเมลพร้อมข้อความแสดงข้อผิดพลาดและสิ้นสุดสคริปต์:
<?php// ฟังก์ชันการจัดการข้อผิดพลาด customError($errno, $errstr){ echo "<b>ข้อผิดพลาด:</b> [$errno] $errstr<br>"; ("ข้อผิดพลาด: [$errno] $errstr",1, "[email protected]", "จาก: [email protected]");}// ตั้งค่าฟังก์ชันการจัดการข้อผิดพลาด set_error_handler("customError",E_USER_WARNING); // ข้อผิดพลาดของทริกเกอร์ $test=2;if ($test>1){ trigger_error("ค่าตัวแปรต้องน้อยกว่าหรือเท่ากับ 1",E_USER_WARNING);} ?>
ผลลัพธ์ของโค้ดด้านบนมีลักษณะดังนี้:
ข้อผิดพลาด: [512] ค่าตัวแปรต้องน้อยกว่าหรือเท่ากับ 1 ผู้ดูแลเว็บไซต์ได้รับแจ้งแล้ว
อีเมลที่ได้รับจากโค้ดด้านบนมีลักษณะดังนี้:
ข้อผิดพลาด: [512] ค่าตัวแปรต้องน้อยกว่าหรือเท่ากับ 1
วิธีนี้ไม่เหมาะกับข้อผิดพลาดทั้งหมด ข้อผิดพลาดทั่วไปควรถูกบันทึกไว้บนเซิร์ฟเวอร์โดยใช้ระบบบันทึก PHP เริ่มต้น