",); $html = str_replace($search, $replace, $html); $dom = new DOMDocument(); $dom->loadHTML($html);
ฉันมักจะได้ยินเกี่ยวกับปัญหานี้จากผู้ใช้รายอื่น เนื่องจากโฮสต์บางส่วนจำเป็นต้องซ่อนข้อผิดพลาดที่ปรากฏ แต่บางคนจำเป็นต้องเข้าใจสิ่งที่เกิดขึ้นกับโค้ดของตนเนื่องจากไม่มีข้อผิดพลาดใด ๆ ปรากฏขึ้น ในบทความนี้ ฉันจะพยายามแสดงวิธีหลักๆ ในการแสดง/ซ่อนข้อผิดพลาด
ในสคริปต์ PHP
1)
มีเพียงคำสั่งเดียวใน PHP ที่รองรับระบบการจัดการข้อผิดพลาด - นี่คือ
เข้าสู่ระบบ @- ช่วยให้คุณสามารถละเว้นข้อความแสดงข้อผิดพลาดได้ ต้องวางไว้หน้านิพจน์ที่อาจมีอยู่
มีข้อผิดพลาดโดยเจตนาในตัวอย่าง แต่จะไม่แสดงขึ้น
$value = @$var[$key];
2)
คุณยังสามารถแทรกการตั้งค่าพารามิเตอร์การแสดงข้อผิดพลาดก่อนสคริปต์ PHP ที่คุณกำลังตรวจสอบ ( display_errors- โดยอาจรับค่าเป็นเปิด (แสดง) หรือปิด (ซ่อน)
Ini_set("display_errors", "เปิด");
error_reporting("E_ALL");
ดังนั้นหลังจากโค้ดที่ตรวจสอบข้อผิดพลาดแล้ว ให้ตั้งค่าพารามิเตอร์กลับคืน
Ini_set("display_errors", "ปิด");
ตัวอย่างเช่น คุณต้องการดูข้อผิดพลาดในสคริปต์
Ini_set("display_errors", "เปิด"); // ข้อความแสดงข้อผิดพลาดจะปรากฏขึ้น
error_reporting(E_ALL); // E_ALL - แสดงข้อผิดพลาดทั้งหมด
$value = $var[$key]; // ตัวอย่างข้อผิดพลาด
ini_set("display_errors", "ปิด"); // ตอนนี้จะไม่มีข้อความ
คุณสามารถตั้งค่าด้วยวิธีอื่นได้ (ปิดที่ด้านบนและด้านล่าง) เพื่อไม่ให้ข้อผิดพลาดแสดงในส่วนเฉพาะของโค้ด
ในไฟล์ .htaccess
บ่อยครั้งที่ปัญหาได้รับการแก้ไขโดยการระบุการตั้งค่าในไฟล์
.htaccessซึ่งอยู่ในไดเร็กทอรีรากของไซต์ ในบรรทัด php_flag display_errors คุณต้องตั้งค่าเปิดหรือปิดด้วย
Php_flag display_errors เปิดอยู่
#แสดงข้อผิดพลาดทั้งหมด ยกเว้นคำเตือน (ประกาศ)
php_value error_reporting "E_ALL & ~E_NOTICE"
ในไฟล์ php.ini
อย่างที่คุณเห็น สามารถระบุพารามิเตอร์ได้หลายตำแหน่ง อย่างไรก็ตาม หากคุณต้องการให้พารามิเตอร์นี้มีค่าที่แน่นอนทั่วทั้งไซต์ ก็ง่ายกว่าที่จะตั้งค่าในไฟล์ php.ini (อาจไม่สามารถเข้าถึงได้บนโฮสติ้งเสมอไป) แต่ในกรณีนี้ คุณสามารถเลี่ยงผ่าน การตั้งค่าของโฮสติ้งทั้งหมด
ใน php.ini:
Error_reporting = E_ALL
display_errors เปิดอยู่
ในบรรทัดบนสุดเราเลือกข้อผิดพลาดทุกประเภท ในบรรทัดล่างสุดเราให้การดำเนินการล่วงหน้าสำหรับการแสดงผล
หลังจากการแก้ไข คุณต้องรีสตาร์ท Apache เพื่อให้การตั้งค่าเปลี่ยนแปลงและมีผล (อย่างสง่างามหรือรีสตาร์ท):
Sudo apachectl -k สง่างาม
พารามิเตอร์ข้อผิดพลาดได้รับการประมวลผลตามลำดับใด
ในตอนแรกพารามิเตอร์ php.ini จะถูกนำมาพิจารณา จากนั้น .htaccess และสิ่งที่ระบุโดยตรงในสคริปต์ PHP ดังนั้นหากมีบางอย่างใช้งานไม่ได้ ให้ลองตรวจดูห่วงโซ่ บางทีอาจมีการตั้งค่าที่แตกต่างออกไป
และเช่นเคย ขอขอบคุณสำหรับความสนใจและขอให้โชคดี! ฉันหวังว่าบทความนี้จะมีประโยชน์!
PHP รองรับตัวดำเนินการควบคุมข้อผิดพลาดหนึ่งตัว: เครื่องหมาย @
ในกรณีที่อยู่ข้างหน้านิพจน์ใดๆ ในโค้ด PHP ข้อความแสดงข้อผิดพลาดใดๆ ที่สร้างโดยนิพจน์นั้นจะถูกละเว้น หากคุณได้ติดตั้งฟังก์ชันการจัดการข้อผิดพลาดของคุณเองโดยใช้ set_error_handler() จากนั้นจะยังคงถูกเรียก อย่างไรก็ตาม หากฟังก์ชันนี้ถูกเรียกใช้ภายในฟังก์ชันนี้ error_reporting()
จากนั้นจะส่งคืนค่า 0 หากฟังก์ชันที่ทำให้เกิดข้อผิดพลาดนั้นถูกระงับโดยใช้ @ หากมีการติดตั้งตัวเลือก track_errors
ข้อความแสดงข้อผิดพลาดที่สร้างขึ้นทั้งหมดจะถูกจัดเก็บไว้ในตัวแปร $php_errormsg
ตัวแปรนี้จะถูกเขียนทับด้วยข้อผิดพลาดใหม่แต่ละรายการ ดังนั้นให้ตรวจสอบทันทีหากจำเป็น
// ข้อผิดพลาดโดยเจตนาเมื่อทำงานกับไฟล์ $my_file = @file("non_existent_file") หรือตาย(
"ข้อผิดพลาดในการเปิดไฟล์: ข้อความแสดงข้อผิดพลาดคือ:"
$php_errormsg "" );
// ใช้ได้กับนิพจน์ใดๆ ไม่ใช่แค่ฟังก์ชัน
?>
$value = @ $แคช [ $key ];:
// หากไม่มี $key ข้อความแสดงข้อผิดพลาด (การแจ้งเตือน) จะไม่ปรากฏขึ้น ความคิดเห็นตัวดำเนินการ @ ใช้ได้กับนิพจน์เท่านั้น มีกฎง่ายๆ คือ: หากมีสิ่งใดส่งคืนค่า คุณสามารถใช้ตัวดำเนินการ @ นำหน้าค่านั้นได้ ตัวอย่างเช่น คุณสามารถใช้ @ นำหน้าชื่อของตัวแปร ฟังก์ชันที่กำหนดเอง หรือการเรียกได้รวม
, คงที่ เป็นต้น ในเวลาเดียวกัน คุณไม่สามารถใช้โอเปอเรเตอร์นี้ก่อนฟังก์ชันหรือคำจำกัดความคลาส โครงสร้างแบบมีเงื่อนไข เช่น จากนั้นจะยังคงถูกเรียก อย่างไรก็ตาม หากฟังก์ชันนี้ถูกเรียกใช้ภายในฟังก์ชันนี้ถ้า
, foreach ฯลฯ
ตรวจสอบคำอธิบายคุณสมบัติด้วย
และส่วนคู่มือ การจัดการข้อผิดพลาดและฟังก์ชันการบันทึก
ความสนใจ
ในปัจจุบัน ตัวดำเนินการ "@" จะระงับเอาต์พุตของข้อความ แม้ว่าจะเกี่ยวกับข้อผิดพลาดร้ายแรงที่ขัดจังหวะสคริปต์ก็ตาม เหนือสิ่งอื่นใด ซึ่งหมายความว่าหากคุณใช้ "@" เพื่อระงับข้อผิดพลาดที่เกิดขึ้นเมื่อเรียกใช้ฟังก์ชัน หากไม่มีหรือเขียนไม่ถูกต้อง การดำเนินการสคริปต์ต่อไปจะหยุดลงโดยไม่มีการแจ้งเตือนใดๆ
12 ปีที่แล้ว
หากต้องการระงับข้อผิดพลาดสำหรับคลาส/อ็อบเจ็กต์ใหม่:
// ทดสอบแล้ว: PHP 5.1.2 ~ 13-10-2549
// ตัวอย่างทั่วไป
// ไม่ทำงาน!
//$var = ใหม่ @some_class(); // ข้อผิดพลาดทางไวยากรณ์
?>
ฉันพบว่าสิ่งนี้มีประโยชน์มากที่สุดเมื่อเชื่อมต่อกับ
ฐานข้อมูลที่ฉันต้องการควบคุมข้อผิดพลาด
และคำเตือนที่แสดงต่อลูกค้าในขณะที่ยังคงอยู่
โดยใช้รูปแบบคลาสของการเข้าถึง
14 ปีที่แล้ว
ควรใช้ฟังก์ชัน trigger_error() () ดีกว่า
เพื่อแสดงประกาศ คำเตือน และข้อผิดพลาดที่กำหนดไว้มากกว่าการตรวจสอบระดับข้อผิดพลาดด้วยตนเอง สิ่งนี้ช่วยให้คุณเขียนข้อความไปยังไฟล์บันทึกหากกำหนดไว้ใน php.ini เอาต์พุต
ข้อความขึ้นอยู่กับระดับ error_reporting() และระงับเอาต์พุตโดยใช้เครื่องหมาย @
8 ปีที่แล้ว
หากคุณใช้ข้อยกเว้น ErrorException เพื่อให้มีการจัดการข้อผิดพลาดแบบครบวงจร ฉันจะแนะนำให้คุณทดสอบกับ error_reporting ในตัวจัดการข้อผิดพลาด ไม่ใช่ในตัวจัดการข้อยกเว้น เนื่องจากคุณอาจพบอาการปวดหัว เช่น หน้าว่าง เนื่องจาก error_reporting อาจไม่ถูกส่งไปยังตัวจัดการข้อยกเว้น .
{
}
ฟังก์ชั่น catchException ($e)
{
{
กลับ;
}
//ทำบางอย่าง.
}
?>
จะดีกว่าถ้าทำ:
ฟังก์ชั่น ข้อยกเว้น_error_handler ($errno , $errstr , $errfile , $errline )
{
ถ้า (error_reporting() === 0 )
{
กลับ;
}
โยน ErrorException ใหม่ ($errstr, 0, $errno, $errfile, $errline);
}
Set_error_handler("ข้อยกเว้น_ข้อผิดพลาด_handler");
ฟังก์ชั่น catchException ($e)
{
//ทำบางอย่าง.
}
Set_Exception_handler("catchException");
?>
4 ปีที่แล้ว
แม้ว่าคุณจะไม่ควรเสรีนิยมเกินไปกับตัวดำเนินการ @ แต่ฉันก็ไม่เห็นด้วยกับคนที่อ้างว่ามันเป็นบาปขั้นสูงสุด
ตัวอย่างเช่น การใช้งานที่สมเหตุสมผลมากคือการระงับข้อผิดพลาดระดับการแจ้งเตือนที่สร้างโดย parse_ini_file() หากคุณทราบว่าไฟล์ .ini อาจหายไป
ในกรณีของฉันการรับค่าส่งคืน FALSE ก็เพียงพอแล้วที่จะจัดการกับสถานการณ์นั้น แต่ฉันไม่ต้องการให้ API ของฉันแสดงข้อผิดพลาดการแจ้งเตือน
TL; DR: ใช้มัน แต่ถ้าคุณรู้ว่าคุณกำลังระงับอะไรและทำไม
2 ปีที่แล้ว
พฤติกรรมของ PHP สำหรับตัวแปรที่กำหนดค่าตอบแทนของนิพจน์ที่ได้รับการป้องกันโดยตัวดำเนินการควบคุมข้อผิดพลาดเมื่อนิพจน์พบข้อผิดพลาดคืออะไร
จากโค้ดต่อไปนี้ ผลลัพธ์จะเป็น NULL (แต่คงจะดีถ้าได้รับการยืนยันว่าเป็นจริงในทุกกรณี)
$วาร์ = 3 ;
$arr = อาร์เรย์();
$var = @ $arr [ "x" ]; // มูลค่าของ $var หลังจากการมอบหมายนี้คืออะไร?
// มันเป็นค่าก่อนหน้า (3) เหมือนกับว่าการมอบหมายไม่เคยเกิดขึ้นเลยเหรอ?
// มันเป็น FALSE หรือ NULL?
// มันเป็นข้อยกเว้นหรือข้อความแสดงข้อผิดพลาดหรือหมายเลขข้อผิดพลาดบางอย่าง?
Var_dump($var); // พิมพ์ "โมฆะ"
?>
5 ปีที่แล้ว
ฉันสงสัยว่าใคร (อื่น) อาจพบคำสั่งให้ปิดการใช้งาน/เปิดใช้งานตัวดำเนินการผิดพลาดหรือไม่จะเป็นส่วนเพิ่มเติมที่มีประโยชน์ นั่นคือแทนที่จะเป็นสิ่งที่ชอบ (ซึ่งฉันเคยเห็นมาสองสามแห่งในโค้ดบางส่วน):
ถ้า(กำหนด(PRODUCTION )) {
@การทำงาน();
}
อื่น(
การทำงาน();
}
?>
อาจมีบางอย่างเช่นนี้:
ถ้า (กำหนด (การผลิต)) (
ini_set ("ข้อผิดพลาด.เงียบ" , TRUE );
}
อื่น(
ini_set ("error.silent" , FALSE );
}
?>
และส่วนคู่มือ การจัดการข้อผิดพลาดและฟังก์ชันการบันทึก
หากคุณต้องการบันทึกข้อความแสดงข้อผิดพลาดทั้งหมดสำหรับสคริปต์ php จากเซสชัน คุณสามารถใช้สิ่งนี้:
session_start();
ฟังก์ชั่นผิดพลาด ($error, $return = FALSE) (
$php_errormsg ทั่วโลก;
ถ้า(isset($_SESSION [ "php_errors" ])) (
$_SESSION [ "php_errors" ] = อาร์เรย์();
}
$_SESSION [ "php_errors" ] = $ข้อผิดพลาด ; // อาจจะใช้ $php_errormsg
ถ้า($return == TRUE ) (
$ข้อความ = "" ;
foreach($_SESSION [ "php_errors" ] เป็น $php_error ) (
$ข้อความ .= $php_error "\n" ;
}
ส่งคืนข้อความ $; // หรือคุณสามารถใช้ use $_SESSION["php_errors"]
}
}
?>
หวังว่านี่จะช่วยใครซักคน ...
PHP มอบวิธีที่ยอดเยี่ยมในการควบคุมข้อผิดพลาดที่เกิดขึ้น ที่นี่เราจะพูดถึงวิธีจัดการกับข้อผิดพลาด - รายงาน (หรือไม่รายงาน) เหตุการณ์ต่อผู้ใช้ หากจำเป็น - แจ้งผู้ดูแลระบบทางอีเมล เขียนข้อมูลเกี่ยวกับเหตุการณ์ลงในไฟล์บันทึก
ก่อนอื่น เรามากำหนดข้อผิดพลาดใน PHP กันก่อน
PHP รองรับระดับข้อผิดพลาดต่อไปนี้:
E_ERROR
E_คำเตือน
E_พาร์ส
E_ประกาศ
E_CORE_ERROR
E_CORE_WARNING
E_COMPILE_ERROR
E_COMPILE_WARNING
E_USER_ERROR
E_USER_WARNING
E_USER_ประกาศ
อี_ออล
E_STRICT
อันที่จริง ค่าเหล่านี้เป็นเพียงค่าคงที่ที่ใช้ในการกำหนดระดับการจัดการข้อผิดพลาดและสร้างบิตมาสก์ ค่าคงที่มีชื่อที่มีความหมาย เมื่อพิจารณาถึงค่าคงที่ - เราสามารถพูดได้ว่าข้อผิดพลาดระดับ E_PARSE เกิดขึ้นในกรณีที่มีข้อผิดพลาดทางไวยากรณ์ E_NOTICE เป็นเครื่องเตือนใจให้โปรแกรมเมอร์เกี่ยวกับการละเมิด "สไตล์ที่ดี" ของการเขียนโปรแกรม PHP
ตัวอย่างบางส่วน:
เมื่อการเชื่อมต่อกับฐานข้อมูล MySQL (หรืออื่นๆ) ล้มเหลว ล่าม PHP จะรายงานข้อผิดพลาด E_WARNING
คำเตือน: mysql_connect(): การเข้าถึงถูกปฏิเสธสำหรับผู้ใช้: "VVingless@localhost" (การใช้รหัสผ่าน: YES) ใน /home/mysite/index.php (บรรทัด 83)
หมายเหตุ: เพื่อให้ล่าม PHP รายงานข้อผิดพลาด PHP จะต้องได้รับการกำหนดค่าตามนั้น: ต้องเปิดใช้งานการตั้งค่าสถานะ display_errors - 1 คำสั่ง error_reporting ต้องระบุว่าจำเป็นต้องแสดงข้อผิดพลาดของระดับ E_WARNING (โดยเฉพาะอย่างยิ่ง อื่น ๆ ). หากค่าของคำสั่งเหล่านี้ไม่ตรงตามความต้องการของคุณ คุณสามารถลองติดตั้งด้วยตนเองโดยวางไฟล์ .htaccess ลงในโฟลเดอร์ที่มีสคริปต์ (ต้องมีจุดที่จุดเริ่มต้นของชื่อ) โดยมีเนื้อหาโดยประมาณดังนี้:
เปิด Php_flag display_errors
php_value error_reporting "E_ALL & ~E_NOTICE"
ซึ่งหมายความว่าข้อความแสดงข้อผิดพลาดจะแสดงในทุกระดับ ยกเว้น E_NOTICE
เมื่อโปรแกรมเมอร์สร้างข้อผิดพลาดทางไวยากรณ์ ล่าม PHP จะรายงานข้อผิดพลาดระดับ E_PARSE
ข้อผิดพลาดในการแยกวิเคราะห์: ข้อผิดพลาดในการแยกวิเคราะห์ ไม่คาดคิด '(' คาดว่าจะ T_STRING ใน /home/mysite/index.php ออนไลน์ 150
แต่ระดับข้อผิดพลาดที่น่าสนใจที่สุดสำหรับเราคือ E_USER_ERROR และ E_USER_WARNING ตามชื่อที่แสดง ระดับข้อผิดพลาดเหล่านี้คือระดับข้อผิดพลาดที่ผู้ใช้สามารถกำหนดได้ มีฟังก์ชัน trigger_error() สำหรับสิ่งนี้ - คุณสามารถแจ้งให้ผู้ใช้ทราบเกี่ยวกับเหตุการณ์ได้เช่นเดียวกับที่ PHP ทำ
ดังที่คุณทราบจากคู่มือ PHP ฟังก์ชัน trigger_error() รับพารามิเตอร์สองตัว
เป็นโมฆะ trigger_error (สตริง error_msg [, int error_type])
พารามิเตอร์แรกคือข้อความแสดงข้อผิดพลาด เช่น "ไม่พบไฟล์" พารามิเตอร์ตัวที่สองกำหนดระดับข้อผิดพลาด ฟังก์ชัน trigger_error() ใช้งานได้กับกลุ่มข้อผิดพลาด E_USER เท่านั้น ซึ่งหมายความว่าคุณสามารถตั้งค่าระดับข้อผิดพลาด E_USER_ERROR, E_USER_WARNING, E_USER_NOTICE และไม่สามารถตั้งค่าระดับข้อผิดพลาด E_WARNING ได้ พารามิเตอร์ที่สองเป็นทางเลือกและมีค่าเริ่มต้นเป็น E_USER_NOTICE
มาลองกัน:
สมมติว่าข้อมูลของเราสำหรับฟีดข่าวถูกจัดเก็บไว้ในไฟล์ news.txt และหากไม่พบไฟล์ เราจำเป็นต้องรายงานข้อผิดพลาด ข้อความของโปรแกรมจะมีลักษณะดังนี้:
ถ้า (!file_exists('/home/mysite/news.txt')) (
trigger_error('ไม่พบไฟล์ข่าว');
}
เป็นผลให้ล่าม PHP จะรายงานข้อผิดพลาดที่ระดับ E_USER_NOTICE
หมายเหตุ: ไม่พบไฟล์ข่าวใน /home/mysite/index.php ออนไลน์ 47
แต่สิ่งนี้ให้อะไรเรา? ประการแรก หากมีการตั้งค่าคำสั่งใน php.ini หรือไฟล์ .htaccess
php_value log_errors "1"
php_value log_errors_max_len "1024"
php_value error_log "/home/mysite/my.log"
จากนั้นบันทึกเหตุการณ์จะถูกเพิ่มลงในไฟล์ /home/mysite/my.log โดยอัตโนมัติ
ประกาศเกี่ยวกับ PHP: ไม่พบไฟล์ข่าวใน /home/mysite/index.php ออนไลน์ 47
ต่อไป เมื่อใช้ฟังก์ชัน set_error_handler() เราสามารถตั้งค่าตัวจัดการข้อผิดพลาดของเราเองที่เกิดขึ้นระหว่างการทำงานของสคริปต์ PHP
ดังที่คุณทราบจากคู่มือ ใน PHP 4 ฟังก์ชันจะใช้พารามิเตอร์สตริงตัวเดียว - ชื่อของฟังก์ชันที่จะดำเนินการทุกครั้งที่เกิดข้อผิดพลาด PHP 5 ช่วยให้สามารถตั้งค่าพารามิเตอร์ได้อีกหนึ่งพารามิเตอร์ - ประเภทของข้อผิดพลาดที่จะดำเนินการโดยใช้ตัวจัดการของเรา ฟังก์ชันส่งคืนสตริง - ชื่อของฟังก์ชันตัวจัดการที่ได้รับการติดตั้งจนถึงจุดนี้
สตริง set_error_handler (การเรียกกลับ error_handler [, int error_types])
ตั้งแบบนี้
set_error_handler("my_error_handler");
ฟังก์ชันแบบกำหนดเองที่จะจัดการกับข้อผิดพลาดสามารถยอมรับพารามิเตอร์อินพุตต่อไปนี้:
— รหัสระดับข้อผิดพลาด
— การตีความสตริงของข้อผิดพลาด
— ชื่อของไฟล์ที่เกิดข้อผิดพลาด
— เส้นที่เกิดข้อผิดพลาด
ควรสังเกตว่าฟังก์ชันนี้ไม่สามารถจัดการข้อผิดพลาดในระดับ E_ERROR, E_PARSE, E_CORE_ERROR, E_CORE_WARNING, E_COMPILE_ERROR, E_COMPILE_WARNING
นี่เป็นเพราะความจริงที่ว่าข้อผิดพลาดในระดับที่แสดงไว้เกิดขึ้นก่อนที่ล่ามจะได้รับข้อมูลเกี่ยวกับตัวจัดการข้อผิดพลาดแบบกำหนดเอง
เรามาประกาศฟังก์ชันของเรากันดีกว่า
ฟังก์ชั่น my_error_handler($code, $msg, $file, $line) (
}
หมายเหตุ: แต่ละสคริปต์ที่มีขนาดใหญ่มากหรือน้อยมักจะแบ่งออกเป็นหลายไฟล์เพื่อความสะดวกในการทำงาน วิธีจัดระเบียบโมดูลาร์ของโปรแกรมเป็นหัวข้อสำหรับการสนทนาแยกต่างหาก ตอนนี้ ฉันแค่อยากจะแนะนำให้แยกการตั้งค่าทั่วไปออกเป็นไฟล์แยกต่างหาก ซึ่งจะรวมไว้ที่จุดเริ่มต้นของโปรแกรมโดยใช้คำสั่ง include หรือใช้คำสั่ง auto_prepend_file ตัวจัดการของเราสามารถวางไว้ในไฟล์นี้ได้ ควรติดตั้งตัวจัดการข้อผิดพลาดให้ใกล้กับจุดเริ่มต้นของโปรแกรมมากที่สุดเท่าที่จะเป็นไปได้ โดยเฉพาะอย่างยิ่งที่จุดเริ่มต้น
เพื่อให้แน่ใจว่าใช้งานได้จริง มาสร้างไฟล์ PHP ใหม่และลองเรียกใช้งานกัน
เนื้อหาของไฟล์ myerrortest.php
n"; echo "$file ($line)"; ) set_error_handler("my_error_handler"); if (!file_exists("/home/mysite/news.txt")) ( trigger_error("ไม่พบไฟล์ข่าว"); ) ?>
ผลลัพธ์ของการประมวลผลไฟล์นี้จะเป็นดังนี้:
เกิดข้อผิดพลาด: ไม่พบไฟล์ข่าว (1024)
/home/mysite/myerrortest.php (12)
ตอนนี้เรามีฟังก์ชันที่รับข้อมูลเกี่ยวกับข้อผิดพลาดทั้งหมดที่เกิดขึ้น ลองคิดดูว่าเราจะใช้สิ่งนี้ได้อย่างไร
เราจะจัดการกับข้อผิดพลาดระดับ
E_ERROR
E_คำเตือน
E_ประกาศ
E_USER_ERROR
E_USER_ประกาศ
ข้อผิดพลาดสามประการแรกในโปรแกรมที่สมบูรณ์ที่ดีไม่ควรเกิดขึ้นเลย ดังนั้นเราจะแจ้งให้ผู้ใช้ทราบโดยการแสดงข้อความแสดงข้อผิดพลาดบนหน้าจอเท่านั้น วิธีนี้ทำให้คุณสามารถทำงานได้ในขณะที่สคริปต์อยู่ระหว่างการพัฒนา จากนั้นข้อความเกี่ยวกับสคริปต์เหล่านั้นสามารถปิดใช้งานหรือบันทึกลงในไฟล์บันทึกได้
สำหรับอีกสองคน - ตามที่คุณเดาแล้ว - พวกมันจะมีประโยชน์ที่นั่น เราเองจะทำให้เกิดข้อผิดพลาดในระดับเหล่านี้หากจำเป็น สมมติว่าข้อผิดพลาดระดับ E_USER_ERROR จะถูกเรียกในกรณีที่ข้อความแสดงข้อผิดพลาดควรเข้าไปในไฟล์บันทึกและถูกส่งไปยังอีเมลถึงผู้ดูแลระบบ (ตัวอย่างเช่น เกิดข้อผิดพลาดขณะดำเนินการสืบค้น SQL หรือมี ไม่มีรหัสผ่านการเข้าถึงไฟล์ที่ต้องการ) ข้อผิดพลาดในระดับ E_USER_NOTICE จะเกิดขึ้นเมื่อเกิดข้อผิดพลาด "เล็กน้อย" (เช่น ผู้ใช้กรอกแบบฟอร์มไม่ถูกต้อง หรือขอบันทึกที่ไม่มีอยู่จริงจากฐานข้อมูล)
ตอนนี้ฟังก์ชันการจัดการข้อผิดพลาดของเราจะมีลักษณะดังนี้:
// การตั้งค่าเบื้องต้นบางอย่าง // ตั้งค่าโหมดแสดงข้อผิดพลาด // แสดงข้อผิดพลาดทั้งหมด ยกเว้น E_NOTICE error_reporting (E_ALL & ~E_NOTICE); // ค่าคงที่นี้รับผิดชอบ // การเปิด/ปิดโหมดการดีบัก // ในระหว่างการดีบั๊ก - ข้อความจะไม่ถูกส่ง // ทางไปรษณีย์ แต่เพียงพิมพ์บนหน้าจอ กำหนด("DEBUG", 0); // นี่คือตัวแปรโกลบอลที่ // จะเก็บข้อความที่ // ผู้ใช้ควรเห็น $MSG = ""; // อีเมลของผู้พัฒนาที่จะส่งข้อผิดพลาดกำหนด ("ADM_EMAIL", [ป้องกันอีเมล]"); // ไฟล์บันทึกกำหนด ("LOGFILE","/home/mysite/mylog.log"); // ความแตกต่างของเวลากับเซิร์ฟเวอร์ (เป็นวินาที) กำหนด ("TIMEOFFSET", 0); // ฟังก์ชั่นนั้นเอง function my_error_handler($code, $msg, $file, $line) ( // ตัวแปรโกลบอลที่จะเขียนข้อความแสดงข้อผิดพลาด // จะถูกเขียน global $MSG; // ข้ามข้อผิดพลาดที่ระดับ E_NOTICE // และละเว้นข้อผิดพลาดหาก การรายงานข้อผิดพลาดโหมดข้อความถูกปิดใช้งานหาก (($code == E_NOTICE) หรือ (error_reporting() == 0)) ( return; ) // ถ้าเราแจ้งข้อผิดพลาดระดับ E_USER_NOTICE - เพียงแค่ // เขียนข้อความแสดงข้อผิดพลาดไปยังตัวแปรส่วนกลาง $MSG // และหยุดการทำงานของฟังก์ชันถ้า ($code == E_USER_NOTICE) ( $MSG = $msg; Return; ) // ถ้าระดับข้อผิดพลาดคือ E_ERROR - พิมพ์ข้อความแสดงข้อผิดพลาด // และดำเนินการเรียกใช้สคริปต์ให้เสร็จสิ้น ถ้า ($รหัส == E_ERROR) ( ตาย ("
ข้อผิดพลาด:".$ข้อความ"
ใน ".$ ไฟล์" (บรรทัด ".$บรรทัด")
"); ) // หากข้อผิดพลาดอยู่ที่ระดับ E_WARNING ให้พิมพ์ข้อความแสดงข้อผิดพลาด // และหยุดดำเนินการฟังก์ชันหาก ($code == E_WARNING) ( echo "
คำเตือน:".$ข้อความ"
ใน ".$ ไฟล์" (บรรทัด ".$บรรทัด")
"; Return; ) // หากระดับข้อผิดพลาดคือ E_USER_ERROR ถ้า ($code == E_USER_ERROR) ( // เขียนข้อความในตัวแปร $MSG ที่เกิดข้อผิดพลาด // เราจะไม่รายงานเหตุผล เราจะรายงานเท่านั้น ว่ารายละเอียด // ถูกส่งไปยังอีเมลถึงใครก็ตามที่ควรจะเป็น $MSG = "ข้อผิดพลาดร้ายแรง: การดำเนินการไม่เสร็จสมบูรณ์
มีการส่งข้อความแสดงข้อผิดพลาดไปยังผู้พัฒนาแล้ว"; // รายละเอียดถูกเขียนไปยังตัวแปร $text $text = $msg"
"."ไฟล์: ".$ไฟล์" (".$line.")"; // หากค่าคงที่ DEBUG ตั้งไว้ที่ 1 เราจะพิมพ์ข้อมูลเกี่ยวกับ // ข้อผิดพลาดไปที่หน้าจอ ถ้าไม่เช่นนั้น เราจะส่งข้อความแสดงข้อผิดพลาดทางไปรษณีย์ // ฟังก์ชั่น error_mail() และ เขียนลงในบันทึก - ฟังก์ชั่น error_writelog() if (DEBUG == 1) ( error_print($text); ) else ( error_mail($text); error_writelog($text); ) Return; ) ) // ตั้งค่าตัวจัดการ set_error_handler( "my_error_handler"); ตอนนี้เราอธิบายฟังก์ชันบริการ / / ฟังก์ชันพิมพ์ข้อผิดพลาดไปที่ฟังก์ชันหน้าจอ error_print($text) ( echo $text"
"; ) // ฟังก์ชั่นส่งข้อผิดพลาดทางเมล ฟังก์ชั่น error_mail($text) ( $text = str_replace("
", "n", $text); $info = "Time: ".get_datetime().."nRemote IP:".get_ip().."n"; mail(ADM_EMAIL, "การรายงานข้อผิดพลาด", $info.$text ) // f เขียนข้อผิดพลาดไปยังฟังก์ชันบันทึก error_writelog($text) ( $text = str_replace("
", "t", $text); if (@$fh = fopen(LOGFILE, "a+")) ( fputs($fh, get_datetime()."t".get_ip()."t".$text. "n"); fclose($fh); ) // รับเวลาโดยคำนึงถึงฟังก์ชันความแตกต่างของเวลา get_time() ( return(date("H:i", time () + TIMEOFFSET)); ) / / รับวันที่โดยคำนึงถึงฟังก์ชันความแตกต่างของเวลา get_date() ( return(date("Y-m-d", time () + TIMEOFFSET)); ) // รับวันที่และเวลาโดยคำนึงถึงฟังก์ชันความแตกต่างของเวลา get_datetime() ( return get_date() " ".get_time(); ) // get the IP function get_ip() ( return($_SERVER["REMOTE_ADDR"]); ) และสุดท้าย ตัวอย่างการใช้งาน // ฟังก์ชันเขียนข่าวสารไปที่ ฟังก์ชั่นไฟล์ write_news($title, $ text) ( $news_file = "/home/mysite/news.txt"; // ตรวจสอบการมีอยู่ของชื่อ - ข้อผิดพลาดไม่สำคัญหาก (!trim($title)) ( // เพื่อตรวจสอบว่าฟังก์ชันสิ้นสุดลง // ล้มเหลว - จำเป็นต้องคืนค่าเท็จ ฟังก์ชัน // trigger_error() - คืนค่าจริง เราจะ // คืนค่าผลลัพธ์กลับหัว !trigger_error("ต้องระบุชื่อข่าว "); ) // ตรวจสอบการมีอยู่ของข้อความข่าว - ข้อผิดพลาดไม่สำคัญหาก (!trim($text)) ( return !trigger_error("You mustระบุข้อความข่าว"); ) // ตรวจสอบการมีอยู่ของ ไฟล์ที่เราจะเขียน // หากไม่พบไฟล์ - เกิดข้อผิดพลาดร้ายแรงหาก (!file_exists($news_file)) ( return !trigger_error("ไม่พบไฟล์ฐานข้อมูลข่าว!", E_USER_ERROR); ) // .. .การประมวลผลข้อมูลเบื้องต้นที่นี่... // เขียนข่าว $fh = fopen ($news_file, "a+"); fputs($fh, $title"t".$text"n"); fclose($fh); // ถ้าทุกอย่างเรียบร้อยดี ฟังก์ชันจะคืนค่าจริง return true; ) // พยายามเขียนข่าว // ข้อมูลนี้สามารถมาจากเว็บฟอร์ม $res = write_news("My news", "Text of my news"); if ($res === false) ( // หากคืนค่า false ให้พิมพ์ข้อผิดพลาด echo $MSG; ) else ( // หากทุกอย่างเป็นไปตามลำดับ คุณสามารถรายงานได้ // หรือดีกว่านั้น ให้ส่งต่อผู้ใช้ไปที่ใดที่หนึ่ง echo "เพิ่มข่าวแล้ว";
เพื่อให้ตัวอย่างใช้งานได้ เพียงคัดลอกโค้ดสามบล็อคก่อนหน้าลงในไฟล์ PHP อย่าลืมตั้งค่าสิทธิ์การเข้าถึงไฟล์บันทึกเป็น 777 เพื่อให้สคริปต์สามารถทำงานร่วมกับมัน ป้อนเส้นทางที่ถูกต้อง และระบุอีเมลของคุณ คุณสามารถเปิดใช้งานโหมดแก้ไขข้อบกพร่องได้โดยการตั้งค่าตัวแปร DEBUG เป็น 1