PHP การจัดการข้อผิดพลาด
- Page Previous PHP Secure E-mail
- Page Next PHP Exception
ใน PHP จะมีการจัดการความผิดพลาดที่ง่ายโดยมาตรฐาน ข้อความหนึ่งจะถูกส่งไปยังเบราเซอร์ ซึ่งมีชื่อไฟล์ หมายเลขบรรทัด และข้อความเล่าถึงความผิดพลาด
PHP การจัดการข้อผิดพลาด
ในการสร้างสคริปต์และแอปพลิเคชันเว็บ การจัดการข้อผิดพลาดเป็นส่วนที่สำคัญ หากตัวแปรที่รับผิดชอบตรวจสอบข้อผิดพลาดของคุณขาดหาย รหัสของคุณจะดูไม่มีความเป็นมืออาชีพ และเปิดโอกาสที่มีความเสี่ยงด้านความปลอดภัย
ตัวเรียนนี้นำเสนอวิธีการตรวจสอบข้อผิดพลาดที่สำคัญที่สุดใน PHP
เราจะเผยแพร่วิธีการจัดการข้อผิดพลาดที่ต่างกัน:
- คำสั่ง "die()" ง่ายๆ
- ข้อผิดพลาดที่เป็นของตัวเอง และตัวกดตัวเตือน
- รายงานข้อผิดพลาด
การจัดการข้อผิดพลาดฺพื้นฐาน: ใช้ฟังก์ชัน die()
ตัวอย่างรหัสที่เปิดไฟล์ทางตรงของข้อความที่แสดงด้านล่าง:
<?php $file=fopen("welcome.txt","r"); ?>
หากไฟล์ไม่มีอยู่ คุณจะได้ข้อความเตือนที่คล้ายๆ นี้:
Warning: fopen(welcome.txt) [function.fopen]: failed to open stream: No such file or directory in C:\webfolder\test.php on line 2
เพื่อที่ผู้ใช้จะไม่ได้ข้อความข้อผิดพลาดที่คล้ายๆ ที่อยู่ด้านบน คุณต้องตรวจสอบว่าไฟล์มีอยู่หรือไม่ก่อนที่จะเข้าถึงไฟล์:
<?php if(!file_exists("welcome.txt")) { die("File not found"); } else { $file=fopen("welcome.txt","r"); } ?>
ตอนนี้ หากไฟล์ไม่มีอยู่ คุณจะได้ข้อความข้อผิดพลาดที่คล้ายๆ นี้:
File not found
เมื่อเทียบกับรหัสที่อยู่ด้านหน้า รหัสด้านบนนี้มีประสิทธิภาพมากขึ้น เนื่องจากมีกลไกจัดการข้อผิดพลาดที่หยุดบทบัญญัติหลังจากที่มีข้อผิดพลาด
อย่างไรก็ตาม การเลิกบทบัญญัติแบบเรียบง่ายไม่จำเป็นที่เหมาะสมทุกครั้ง ขอให้เราศึกษาฟังก์ชันที่ใช้ในการจัดการข้อผิดพลาดใน PHP
สร้างฟังก์ชันการจัดการข้อผิดพลาดที่เป็นของตัวเอง
ทำการสร้างฟังก์ชันการจัดการข้อผิดพลาดที่เป็นของตัวเองเป็นไปได้ง่ายโดยตรง พวกเราเรียกฟังก์ชันพิเศษนี้เมื่อมีข้อผิดพลาดใน PHP。
ฟังก์ชันนี้จำเป็นที่จะมีความสามารถในการจัดการอย่างน้อยสองตัวแปร (ระดับข้อผิดพลาด และข้อความข้อผิดพลาด),แต่สามารถรับอาญาสองห้าตัวแปร (ตัวเลือก: file, line-number และ error context) ได้:
ระบบทางภาษา
error_function(error_level, error_message, error_file, error_line, error_context)
ตัวแปร | Description |
---|---|
error_level | จำเป็น。ระดับรายงานข้อผิดพลาดที่กำหนดโดยผู้ใช้ ต้องเป็นค่าตัวเลข。 ดูตารางด้านล่าง: ระดับรายงานข้อผิดพลาด。 |
error_message | จำเป็น。ข้อกำหนดข้อความข้อผิดพลาดที่กำหนดโดยผู้ใช้。 |
error_file | Optional. Specifies the filename where the error occurred. |
error_line | Optional. Specifies the line number where the error occurred. |
error_context | Optional. Specifies an array containing each variable in use and their values when an error occurs. |
Error Reporting Levels
ระดับรายงานความผิดพลาดนี้เป็นชนิดของความผิดพลาดที่บรรณาธิการความผิดพลาดต้องการจัดการ
Value | Constant | Description |
---|---|---|
2 | E_WARNING | ความผิดพลาดที่ไม่เป็นอันตรายในระหว่างเวลาทำงาน ไม่หยุดการปฏิบัติการของสคริปต์ |
8 | E_NOTICE | Run-time 通知 สคริปต์สังเกตว่าอาจมีความผิดพลาดเกิดขึ้น แต่อาจเกิดขึ้นในระหว่างการทำงานปกติของสคริปต์ |
256 | E_USER_ERROR | ความผิดพลาดที่สร้างโดยผู้ใช้ มีความเสี่ยง คล้ายกับ E_ERROR ที่ตั้งค่าโดยพัฒนาโปรแกรมผ่านฟังก์ชัน trigger_error() ของ PHP |
512 | E_USER_WARNING | คำเตือนที่สร้างโดยผู้ใช้ ไม่เป็นอันตราย คล้ายกับ E_WARNING ที่ตั้งค่าโดยพัฒนาโปรแกรมผ่านฟังก์ชัน trigger_error() ของ PHP |
1024 | E_USER_NOTICE | คำเตือนที่สร้างโดยผู้ใช้ คล้ายกับ E_NOTICE ที่ตั้งค่าโดยพัฒนาโปรแกรมผ่านฟังก์ชัน trigger_error() ของ PHP |
4096 | E_RECOVERABLE_ERROR | ความผิดพลาดที่สามารถจับกุมได้ คล้าย E_ERROR แต่สามารถถูกจับกุมโดยบรรณาธิการที่กำหนดโดยผู้ใช้ (ดู set_error_handler()) |
8191 | E_ALL | ความผิดพลาดและคำเตือนทั้งหมด ยกเว้นระดับ E_STRICT (ใน PHP 6.0 ระดับ E_STRICT คือส่วนหนึ่งของ E_ALL) |
ตอนนี้ ให้สร้างฟังก์ชันที่จะจัดการความผิดพลาด
function customError($errno, $errstr) { echo "<b>Error:</b> [$errno] $errstr<br />"; echo "สิ้นสุดสคริปต์"; die(); }
รหัสบทที่กำหนดขึ้นข้างต้นเป็นฟังก์ชันบรรณาธิการความผิดพลาดที่เรียบง่าย เมื่อมีการเรียกใช้ฟังก์ชันนี้ มันจะได้รับระดับความผิดพลาดและข้อความความผิดพลาด หลังจากนั้นมันจะทำการแสดงระดับความผิดพลาดและข้อความ และหยุดสคริปต์
ตอนนี้ เราได้สร้างฟังก์ชันบรรณาธิการความผิดพลาดแล้ว พวกเราต้องตัดสินว่าในตอนไหนจะทำงานฟังก์ชันนี้
Set Error Handler
บรรณาธิการความผิดพลาดปริมาณเริ่มต้นของ PHP คือบรรณาธิการความผิดพลาดที่เป็นส่วนนอก พวกเราตั้งใจที่จะปรับปรุงฟังก์ชันที่กำหนดขึ้นไปเพื่อใช้เป็นบรรณาธิการความผิดพลาดปริมาณเริ่มต้นของสคริปต์ระหว่างการทำงาน
สามารถปรับแก้บรรณาธิการความผิดพลาดเพื่อให้ใช้งานเฉพาะความผิดพลาดบางชนิด ดังนั้นสคริปต์จึงสามารถจัดการความผิดพลาดแตกต่างกัน อย่างไรก็ตาม ในตัวอย่างนี้ เราตั้งใจที่จะใช้บรรณาธิการความผิดพลาดที่เราสร้างเองสำหรับความผิดพลาดทั้งหมด
set_error_handler("customError");
เนื่องจากเราอยากให้ฟังก์ชันที่เราสร้างเองเพื่อจัดการความผิดพลาดทั้งหมด set_error_handler() ต้องการตัวอุปกรณ์เพียงตัวเดียว แต่สามารถเพิ่มตัวอุปกรณ์ที่เลือกใช้เพื่อกำหนดระดับความผิดพลาด
ตัวอย่าง
ทดสอบประมวลผลข้อผิดพลาดนี้โดยการพยายามออกอากาศตัวแปรที่ไม่มีอยู่
<?php //error handler function function customError($errno, $errstr) { echo "<b>Error:</b> [$errno] $errstr"; } //set error handler set_error_handler("customError"); //trigger error echo($test); ?>
ออกที่ของโค้ดดังกล่าวควรมีลักษณะเช่นนี้:
Error: [8] Undefined variable: test
กระตุ้นข้อผิดพลาด
มันเป็นสิ่งที่มีประโยชน์มากที่จะกระตุ้นข้อผิดพลาดในจุดที่ผู้ใช้ใส่ข้อมูลในสคริปต์ ขณะที่ข้อมูลที่ผู้ใช้ใส่ไม่ถูกต้อง ใน PHP งานนี้จะถูกทำโดยฟังก์ชัน trigger_error()
ตัวอย่าง
ในตัวอย่างนี้ ถ้าตัวแปร "test" มากกว่า "1" จะเกิดข้อผิดพลาด
<?php $test=2; if ($test>1) { trigger_error("ค่าต้องเป็น 1 หรือต่ำกว่า"); } ?>
ออกที่ของโค้ดดังกล่าวควรมีลักษณะเช่นนี้:
Notice: ค่าต้องเป็น 1 หรือต่ำกว่า in C:\webfolder\test.php on line 6
คุณสามารถกระตุ้นข้อผิดพลาดในทุกจุดของสคริปต์ โดยการเพิ่มประมาณที่สอง คุณสามารถกำหนดระดับข้อผิดพลาดที่ต้องการ
ประเภทข้อผิดพลาดที่เป็นไปได้
- E_USER_ERROR - ข้อผิดพลาด run-time ที่สร้างโดยผู้ใช้ที่เป็นอันตราย ข้อผิดพลาดไม่สามารถซ่อมแซมได้ การทำงานของสคริปต์ถูกหยุด
- E_USER_WARNING - คำเตือน run-time ที่สร้างโดยผู้ใช้ที่ไม่เป็นอันตราย การทำงานของสคริปต์ไม่ถูกหยุด
- E_USER_NOTICE - โดยมาตรฐาน การแจ้งเตือน run-time ที่สร้างโดยผู้ใช้ สคริปต์พบข้อผิดพลาดที่เป็นไปได้ และอาจเกิดขึ้นเมื่อสคริปต์ทำงานได้ดี
ตัวอย่าง
ในตัวอย่างนี้ ถ้าตัวแปร "test" มากกว่า "1" จะเกิดข้อผิดพลาด E_USER_WARNING ถ้าเกิดข้อผิดพลาด E_USER_WARNING เราจะใช้ประมวลผลข้อผิดพลาดที่เป็นของเราและหยุดสคริปต์
<?php //error handler function function customError($errno, $errstr) { echo "<b>Error:</b> [$errno] $errstr<br />"; echo "สิ้นสุดสคริปต์"; die(); } //set error handler set_error_handler("customError",E_USER_WARNING); //trigger error $test=2; if ($test>1) { trigger_error("Value must be 1 or below",E_USER_WARNING); } ?>
ออกที่ของโค้ดดังกล่าวควรมีลักษณะเช่นนี้:
Error: [512] ค่าต้องเป็น 1 หรือต่ำกว่า สิ้นสุดสคริปต์
ตอนนี้ เราได้เรียนรู้ว่าจะทำไม้เพื่อสร้าง error ของตัวเอง และว่าจะกระตุ้นพวกเขา ตอนนี้เราจะศึกษาบันทึกข้อผิดพลาด
บันทึกข้อผิดพลาด
โดยมาตรฐาน ตามการคอนฟิกิวเรชัน error_log ใน php.ini PHP จะส่งบันทึกข้อผิดพลาดไปยังระบบบันทึกข้อผิดพลาดของเซิร์ฟเวอร์หรือไฟล์ ด้วยการใช้ฟังก์ชัน error_log() คุณสามารถส่งบันทึกข้อผิดพลาดไปยังไฟล์หรือจุดหมายปลายทางที่เฉพาะอย่างยิ่ง
ส่งข้อความข้อผิดพลาดผ่านอีเมลล์ถึงตัวเองเอง คือวิธีที่ดีเพื่อได้รับการแจ้งเตือนข้อผิดพลาดที่เฉพาะอย่างยิ่ง
ส่งข้อความข้อผิดพลาดผ่าน E-Mail
ในตัวอย่างด้านล่าง ถ้ามีความผิดพลาดเฉพาะที่เกิดขึ้น จะส่งอีเมลที่มีข้อความผิดพลาดและจบสคริปต์ลง
<?php //error handler function function customError($errno, $errstr) { echo "<b>Error:</b> [$errno] $errstr<br />"; echo "Webmaster has been notified"; error_log("Error: [$errno] $errstr",1, "someone@example.com","From: webmaster@example.com"); } //set error handler set_error_handler("customError",E_USER_WARNING); //trigger error $test=2; if ($test>1) { trigger_error("Value must be 1 or below",E_USER_WARNING); } ?>
ออกที่ของโค้ดดังกล่าวควรมีลักษณะเช่นนี้:
Error: [512] ค่าต้องเป็น 1 หรือต่ำกว่า Webmaster ได้รับแจ้ง
อีเมลที่ได้รับมาจากโค้ดดังกล่าวมีลักษณะเช่นนี้:
Error: [512] ค่าต้องเป็น 1 หรือต่ำกว่า
วิธีนี้ไม่เหมาะสมสำหรับความผิดพลาดทั้งหมด ความผิดพลาดทั่วไปควรบันทึกลงบนเซิร์ฟเวอร์ด้วยการใช้ระบบบันทึกความผิดพลาดที่มาตรฐานของ PHP
- Page Previous PHP Secure E-mail
- Page Next PHP Exception