การจัดการข้อผิดพลาดเริ่มต้นใน 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
ฟังก์ชั่นนี้จะต้องสามารถที่จะจัดการอย่างน้อยสองพารามิเตอร์ (ระดับความผิดพลาดและข้อผิดพลาด) แต่สามารถรับได้ถึงห้าพารามิเตอร์ (optionally: file, line-number, and the error context) :
วากยสัมพันธ์
error_function(error_level,error_message,
error_file,error_line,error_context)
พารามิเตอร์ | ลักษณะ |
---|---|
error_level | จำเป็นต้องใช้ ระบุระดับการรายงานข้อผิดพลาดสำหรับข้อผิดพลาดที่ผู้ใช้กำหนด ต้องเป็นตัวเลขค่า ดูตารางด้านล่างสำหรับระดับรายงานข้อผิดพลาดที่เป็นไปได้ |
error_message | จำเป็นต้องใช้ ระบุข้อผิดพลาดสำหรับข้อผิดพลาดที่ผู้ใช้กำหนด |
error_file | ไม่จำเป็น. ระบุชื่อไฟล์ที่ข้อผิดพลาดที่เกิดขึ้น |
error_line | ไม่จำเป็น. ระบุจำนวนบรรทัดที่ข้อผิดพลาดที่เกิดขึ้น |
error_context | ไม่จำเป็น. ระบุอาร์เรย์ที่มีตัวแปรทุกคนและค่าของพวกเขาในการใช้งานเมื่อเกิดข้อผิดพลาดที่เกิดขึ้น |
เกิดข้อผิดพลาดในระดับที่รายงาน
เหล่านี้ระดับรายงานข้อผิดพลาดเป็นชนิดที่แตกต่างกันของข้อผิดพลาดที่ผู้ใช้กำหนดจัดการข้อผิดพลาดที่สามารถใช้สำหรับ:
ความคุ้มค่า | คงที่ | ลักษณะ |
---|---|---|
2 | E_WARNING | ไม่ร้ายแรงข้อผิดพลาดเวลาทำงาน การทำงานของสคริปต์ไม่ได้หยุด |
8 | E_NOTICE | ประกาศเวลาทำงาน สคริปต์ที่พบบางสิ่งบางอย่างที่อาจจะมีข้อผิดพลาด แต่ยังสามารถเกิดขึ้นได้เมื่อใช้สคริปต์ตามปกติ |
256 | E_USER_ERROR | ข้อผิดพลาดที่ผู้ใช้สร้างร้ายแรง นี้เป็นเหมือน E_ERROR ที่ตั้งอยู่โดยโปรแกรมเมอร์โดยใช้ฟังก์ชัน PHP trigger_error() |
512 | E_USER_WARNING | เตือนผู้ใช้สร้างที่ไม่ร้ายแรง นี้เป็นเหมือน E_WARNING ที่ตั้งอยู่โดยโปรแกรมเมอร์โดยใช้ฟังก์ชัน PHP trigger_error() |
1024 | E_USER_NOTICE | แจ้งให้ทราบล่วงหน้าที่ผู้ใช้สร้าง นี้เป็นเหมือน E_NOTICE ที่ตั้งอยู่โดยโปรแกรมเมอร์โดยใช้ฟังก์ชัน PHP trigger_error() |
4096 | E_RECOVERABLE_ERROR | ข้อผิดพลาดร้ายแรง catchable นี้เป็นเหมือน E_ERROR แต่สามารถจับโดยจับที่ผู้ใช้กำหนด (see also set_error_handler() ) |
8191 | E_ALL | ข้อผิดพลาดและคำเตือนทั้งหมด (E_STRICT became a part of E_ALL in PHP 5.4) |
ตอนนี้ให้สร้างฟังก์ชั่นในการจัดการกับข้อผิดพลาด:
function customError($errno, $errstr) {
echo "<b>Error:</b> [$errno] $errstr<br>";
echo "Ending Script";
die();
}
รหัสข้างต้นเป็นฟังก์ชั่นจัดการข้อผิดพลาดง่าย เมื่อมันถูกเรียกจะได้รับระดับความผิดพลาดและข้อผิดพลาด หลังจากนั้นจะส่งระดับความผิดพลาดและข้อความและยุติสคริปต์
ตอนนี้ที่เราได้สร้างฟังก์ชั่นจัดการข้อผิดพลาดที่เราต้องตัดสินใจเมื่อมันควรจะเรียก
ชุดจัดการข้อผิดพลาด
จัดการข้อผิดพลาดเริ่มต้นสำหรับ 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("Value must be 1 or below");
}
?>
การส่งออกของรหัสดังกล่าวควรจะเป็นอะไรเช่นนี้
Notice : Value must be 1 or below
in C:\webfolder\test.php on line 6
เกิดข้อผิดพลาดสามารถเรียกได้ทุกที่ที่คุณต้องการในสคริปต์และโดยการเพิ่มพารามิเตอร์ที่สองคุณสามารถระบุสิ่งที่ระดับความผิดพลาดจะถูกเรียก
ประเภทข้อผิดพลาดที่เป็นไปได้:
- E_USER_ERROR - เวลาทำงานผิดพลาดร้ายแรงที่ผู้ใช้สร้าง ข้อผิดพลาดที่ไม่สามารถกู้คืนจาก การทำงานของสคริปต์หยุด
- E_USER_WARNING - ปลอดร้ายแรงเตือนเวลาทำงานที่ผู้ใช้สร้าง การทำงานของสคริปต์ไม่ได้หยุด
- E_USER_NOTICE - เริ่มต้น แจ้งให้ทราบล่วงหน้าระยะเวลาที่ผู้ใช้สร้าง สคริปต์ที่พบบางสิ่งบางอย่างที่อาจจะมีข้อผิดพลาด แต่ยังสามารถเกิดขึ้นได้เมื่อใช้สคริปต์ตามปกติ
ตัวอย่าง
ในตัวอย่างนี้ E_USER_WARNING เกิดขึ้นหากมี "test" ตัวแปรมีขนาดใหญ่กว่า "1" หาก E_USER_WARNING เกิดขึ้นเราจะใช้จัดการข้อผิดพลาดของเราเองและจบสคริปต์:
<?php
//error handler function
function customError($errno, $errstr) {
echo "<b>Error:</b> [$errno] $errstr<br>";
echo "Ending Script";
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] Value must be 1 or below
Ending Script
ตอนนี้ที่เราได้เรียนรู้ที่จะสร้างข้อผิดพลาดของเราเองและวิธีการที่จะเรียกพวกเขาช่วยให้ดูที่การบันทึกข้อผิดพลาด
บันทึกข้อผิดพลาด
โดยค่าเริ่มต้น, PHP ส่งบันทึกข้อผิดพลาดกับระบบการเข้าสู่ระบบของเซิร์ฟเวอร์หรือไฟล์ขึ้นอยู่กับวิธีการกำหนดค่า error_log มีการตั้งค่าในไฟล์ php.ini โดยใช้ error_log() ทำงานคุณสามารถส่งบันทึกข้อผิดพลาดไปยังแฟ้มที่ระบุหรือปลายทางระยะไกล
ส่งข้อความผิดพลาดให้กับตัวเองโดย e-mail สามารถเป็นวิธีที่ดีในการได้รับการแจ้งเตือนจากข้อผิดพลาดที่เฉพาะเจาะจง
ส่งข้อความข้อผิดพลาดทาง E-mail
ในตัวอย่างด้านล่างเราจะส่ง 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,
"[email protected]","From: [email protected]");
}
//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] Value must be 1 or below
Webmaster has been notified
และจดหมายที่ได้รับจากโค้ดข้างต้นมีลักษณะเช่นนี้
Error: [512] Value must be 1 or below
นี้ไม่ควรนำมาใช้กับข้อผิดพลาดทั้งหมด ข้อผิดพลาดปกติควรได้รับการบันทึกไว้บนเซิร์ฟเวอร์ที่ใช้ระบบ PHP เริ่มต้นการเข้าสู่ระบบ