PHP จัดการข้อผิดพลาด
ใน PHP จัดการข้อผิดพลาดเริ่มต้นเป็นเรื่องง่ายมาก ข้อผิดพลาดถูกส่งไปยังเบราว์เซอร์, ข้อความที่มีชื่อไฟล์จำนวนเส้นและรายละเอียดของข้อความข้อผิดพลาด
PHP จัดการข้อผิดพลาด
เมื่อมีการสร้างสคริปต์และการใช้งานเว็บจัดการข้อผิดพลาดเป็นส่วนสำคัญ หากรหัสของคุณขาดการตรวจสอบข้อผิดพลาดรหัสโปรแกรมของคุณอาจจะดูไม่เป็นมืออาชีพมาก แต่ยังเปิดประตูสู่ความเสี่ยงด้านความปลอดภัย
กวดวิชานี้จะแนะนำบางส่วนที่สำคัญที่สุดในการตรวจสอบข้อผิดพลาดวิธี PHP
เราจะอธิบายวิธีการจัดการข้อผิดพลาดที่แตกต่างกันของคุณ:
- ง่าย "ตาย ()" คำสั่ง
- ข้อผิดพลาดที่กำหนดเองและทริกเกอร์ข้อผิดพลาด
- รายงานข้อผิดพลาด
จัดการข้อผิดพลาดพื้นฐาน: การใช้ตาย () ฟังก์ชัน
ตัวอย่างแรกแสดงให้เห็นสคริปต์ง่ายที่เปิดแฟ้มข้อความ:
<?php $file=fopen("welcome.txt","r"); ?>
ถ้าไฟล์ที่ไม่ได้อยู่ที่คุณจะได้รับข้อผิดพลาดเช่นนี้:
Warning: fopen(welcome.txt) [function.fopen]: failed to open stream: No such file or directory in /www/w3big/test/test.php on line 2
เพื่อป้องกันผู้ใช้จากการได้รับข้อความแสดงข้อผิดพลาดคล้ายกับข้างต้นเราตรวจสอบไฟล์ก่อนที่จะเข้าถึงไฟล์ที่มีอยู่:
<?php if(!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_MESSAGE | จำเป็นต้องใช้ ข้อผิดพลาดข้อผิดพลาดที่ผู้ใช้กำหนดที่ระบุไว้ |
error_file | ไม่จำเป็น ชื่อไฟล์ข้อผิดพลาดที่เกิดขึ้นที่ระบุ |
ERROR_LINE | ไม่จำเป็น หมายเลขบรรทัดที่กำหนดไว้ข้อผิดพลาดที่เกิดขึ้น |
error_context | ไม่จำเป็น ระบุอาร์เรย์ที่มีตัวแปรทุกเมื่อเกิดข้อผิดพลาดในการใช้งานและค่าของพวกเขา |
ระดับรายงานข้อผิดพลาด
เหล่านี้ระดับรายงานข้อผิดพลาดเป็นชนิดที่แตกต่างกันของข้อผิดพลาดเกิดข้อผิดพลาดในการประมวลผลที่กำหนดเอง Handler:
值 | 常量 | 描述 |
---|---|---|
2 | E_WARNING | 非致命的 run-time 错误。不暂停脚本执行。 |
8 | E_NOTICE | run-time 通知。在脚本发现可能有错误时发生,但也可能在脚本正常运行时发生。 |
256 | E_USER_ERROR | 致命的用户生成的错误。这类似于程序员使用 PHP 函数 trigger_error() 设置的 E_ERROR。 |
512 | E_USER_WARNING | 非致命的用户生成的警告。这类似于程序员使用 PHP 函数 trigger_error() 设置的 E_WARNING。 |
1024 | E_USER_NOTICE | 用户生成的通知。这类似于程序员使用 PHP 函数 trigger_error() 设置的 E_NOTICE。 |
4096 | E_RECOVERABLE_ERROR | 可捕获的致命错误。类似 E_ERROR,但可被用户定义的处理程序捕获。(参见 set_error_handler()) |
8191 | E_ALL | 所有错误和警告。(在 PHP 5.4 中,E_STRICT 成为 E_ALL 的一部分) |
ตอนนี้ขอสร้างฟังก์ชั่นในการจัดการกับข้อผิดพลาด:
function customError($errno, $errstr) { echo "<b>Error:</b> [$errno] $errstr<br>"; echo "脚本结束"; die(); }
รหัสข้างต้นเป็นหน้าที่จัดการข้อผิดพลาดง่าย เมื่อมันถูกเรียกก็จะได้รับระดับข้อผิดพลาดและข้อความผิดพลาด หลังจากนั้นจะส่งระดับความผิดพลาดและข้อความและยุติสคริปต์
ตอนนี้เราได้สร้างฟังก์ชั่นการจัดการข้อผิดพลาดเราต้องตรวจสอบเมื่อมีการเรียกฟังก์ชั่น
การตั้งค่าการจัดการข้อผิดพลาด
จัดการข้อผิดพลาดเริ่มต้นของ PHP เป็นตัวในการจัดการข้อผิดพลาด พวกเราจะไปเปลี่ยนฟังก์ชั่นดังกล่าวข้างต้นระยะเวลาการจัดการข้อผิดพลาดเริ่มต้นของสคริปต์
คุณสามารถแก้ไขจัดการข้อผิดพลาดเพื่อที่จะนำมาใช้กับข้อผิดพลาดบางอย่างเพื่อให้สคริปต์ที่สามารถวิธีต่างๆในการจัดการข้อผิดพลาดที่แตกต่างกัน อย่างไรก็ตามในกรณีนี้เราตั้งใจที่จะใช้สำหรับทุกข้อผิดพลาดข้อผิดพลาดของเราเอง Handler:
set_error_handler("customError");
เนื่องจากเราต้องการฟังก์ชั่นของเราเองที่จะจัดการกับข้อผิดพลาดทั้งหมด set_error_handler () ที่จำเป็นเพียงหนึ่งพารามิเตอร์คุณสามารถเพิ่มอาร์กิวเมนต์ที่สองเพื่อระบุระดับความผิดพลาด
ตัวอย่าง
โดยพยายามที่จะตัวแปรผลลัพธ์ที่ไม่ได้อยู่ในการทดสอบการจัดการข้อผิดพลาด:
<?php // 错误处理函数 function customError($errno, $errstr) { echo "<b>Error:</b> [$errno] $errstr"; } // 设置错误处理函数 set_error_handler("customError"); // 触发错误 echo($test); ?>
การส่งออกของโค้ดข้างต้นจะเป็นดังนี้:
Error: [8] Undefined variable: test
ข้อผิดพลาดทริกเกอร์
ในสคริปต์ของผู้ใช้ข้อมูลสถานที่การป้อนข้อมูลเมื่อผู้ใช้ป้อนจะไม่ถูกเรียกเมื่อมีข้อผิดพลาดจะเป็นประโยชน์ ใน PHP นี้จะทำโดย trigger_error () ฟังก์ชันที่จะเสร็จสมบูรณ์
ตัวอย่าง
ในตัวอย่างนี้ถ้า "ทดสอบ" ตัวแปรมีค่ามากกว่า "1" มีข้อผิดพลาดเกิดขึ้น:
<?php $test=2; if ($test>1) { trigger_error("变量值必须小于等于 1"); } ?>
การส่งออกของโค้ดข้างต้นจะเป็นดังนี้:
Notice: 变量值必须小于等于 1 in /www/test/w3big.php on line 5
คุณสามารถเรียกข้อผิดพลาดในสคริปต์ที่ใดก็ได้โดยการเพิ่มพารามิเตอร์ที่สองคุณสามารถระบุระดับความผิดพลาดจะถูกเรียก
ประเภทเป็นไปได้ของข้อผิดพลาด:
- E_USER_ERROR - เวลาทำงานผิดพลาดร้ายแรงที่ผู้ใช้สร้าง ข้อผิดพลาด เรียกสคริปต์ถูกขัดจังหวะ
- E_USER_WARNING - ไม่ร้ายแรงเตือนเวลาทำงานที่ผู้ใช้สร้าง เรียกสคริปต์จะไม่ถูกขัดจังหวะ
- E_USER_NOTICE - เริ่มต้น แจ้งให้ทราบล่วงหน้าเวลาทำงานที่ผู้ใช้สร้าง เมื่อสคริปต์พบข้อผิดพลาดที่อาจเกิดขึ้น แต่ยังอาจเกิดขึ้นในสคริปต์การดำเนินงานปกติ
ตัวอย่าง
ในตัวอย่างนี้ถ้า "ทดสอบ" ตัวแปรมีค่ามากกว่า "1" ข้อผิดพลาดเกิดขึ้น E_USER_WARNING หากเกิดเหตุการณ์นี้ E_USER_WARNING เราจะใช้จัดการข้อผิดพลาดของเราเองและจบสคริปต์:
<?php // 错误处理函数 function customError($errno, $errstr) { echo "<b>Error:</b> [$errno] $errstr<br>"; echo "脚本结束"; die(); } // 设置错误处理函数 set_error_handler("customError",E_USER_WARNING); // 触发错误 $test=2; if ($test>1) { trigger_error("变量值必须小于等于 1",E_USER_WARNING); } ?>
การส่งออกของโค้ดข้างต้นจะเป็นดังนี้:
Error: [512] 变量值必须小于等于 1 脚本结束
ตอนนี้ที่เราได้เรียนรู้วิธีการสร้างข้อผิดพลาดของตัวเองและวิธีการที่จะเรียกพวกเขาให้ดูที่บันทึกข้อผิดพลาด
ข้อผิดพลาดในการเข้าสู่ระบบ
ในกรณีของการเริ่มต้นตามที่กำหนดค่า error_log ตั้งอยู่ใน php.ini ที่ PHP ส่งระบบการบันทึกข้อผิดพลาดในการบันทึกหรือไฟล์เซิร์ฟเวอร์ โดยใช้ error_log () ฟังก์ชันคุณสามารถส่งบันทึกข้อผิดพลาดไปยังแฟ้มที่ระบุหรือปลายทางระยะไกล
มันจะส่งข้อความผิดพลาดให้กับตัวเองทาง e-mail เป็นวิธีที่ดีที่จะได้รับการแจ้งเตือนจากข้อผิดพลาดที่เฉพาะเจาะจง
เกิดข้อผิดพลาดจะถูกส่งทาง e-mail
ในตัวอย่างต่อไปหากมีข้อผิดพลาดเกิดขึ้นเฉพาะเราจะส่ง e-mail ที่มีข้อผิดพลาดและจบสคริปต์:
<?php // 错误处理函数 function customError($errno, $errstr) { echo "<b>Error:</b> [$errno] $errstr<br>"; echo "已通知网站管理员"; error_log("Error: [$errno] $errstr",1, "[email protected]","From: [email protected]"); } // 设置错误处理函数 set_error_handler("customError",E_USER_WARNING); // 触发错误 $test=2; if ($test>1) { trigger_error("变量值必须小于等于 1",E_USER_WARNING); } ?>
การส่งออกของโค้ดข้างต้นจะเป็นดังนี้:
Error: [512] 变量值必须小于等于 1 已通知网站管理员
ข้อความที่ได้รับจากโค้ดข้างต้นจะเป็นดังนี้:
Error: [512] 变量值必须小于等于 1
วิธีนี้ไม่เหมาะสำหรับข้อผิดพลาดทั้งหมด ข้อผิดพลาดแบบเดิมที่ควรจะเป็นโดยใช้ระบบการเข้าสู่ระบบ PHP เริ่มต้นสำหรับการบันทึกบนเซิร์ฟเวอร์