จะเปิดหรือปิดการแสดงข้อผิดพลาดใน PHP ได้อย่างไร? ข้อความแสดงข้อผิดพลาดก่อนหน้า

ส่วนสำคัญของการเขียนโปรแกรมคือการระบุข้อผิดพลาดในโค้ด แม้ว่าโปรแกรมเมอร์จะเป็นโปรแกรมเมอร์ที่เก่ง แต่เขาก็ยังคงทำผิดพลาด บางครั้งก็เป็นเรื่องเล็กน้อยด้วยซ้ำ สิ่งนี้อำนวยความสะดวกโดยธรรมชาติของมนุษย์เอง ดังนั้นโปรแกรมเมอร์จึงใช้เวลาส่วนใหญ่ในการดีบักและระบุข้อผิดพลาดในโค้ด ดังนั้น ยิ่งเครื่องมือในการระบุข้อผิดพลาดในโค้ดมีความยืดหยุ่นและสะดวกยิ่งขึ้นเท่าใด และยิ่งโปรแกรมเมอร์รู้จักข้อผิดพลาดเหล่านี้มากเท่าใด ประสิทธิภาพการทำงานก็จะยิ่งสูงขึ้นเท่านั้น

เนื่องจาก PHP เป็น ภาษาสคริปต์การเขียนโปรแกรม จากนั้นข้อผิดพลาดทั้งหมดที่เกิดขึ้นในโค้ดจะถูกระบุเมื่อมีการดำเนินการโค้ด โปรแกรมเมอร์ PHP จะต้องจัดการกับข้อผิดพลาดมาตรฐานที่มีอยู่ในการเขียนโปรแกรมโดยทั่วไป และข้อผิดพลาดที่ซ่อนอยู่ เช่น การพิมพ์ผิดในการตั้งชื่อตัวแปร

ภาษา PHP มีสองกลไกในการตรวจจับข้อผิดพลาดในสคริปต์ระหว่างการดำเนินการ: กลไกข้อผิดพลาด PHP มาตรฐานและกลไกข้อยกเว้น ใน PHP ฟังก์ชันการทำงานจำนวนมากใช้กลไกข้อผิดพลาดมาตรฐาน ดังนั้นจึงเป็นไปไม่ได้ที่จะไม่ทราบเรื่องนี้ ดังนั้นบทความนี้จะเน้นไปที่กลไกนี้

กลไกข้อผิดพลาด PHP มาตรฐานนั้นค่อนข้างง่าย - หากล่าม PHP พบข้อผิดพลาดขณะเรียกใช้สคริปต์ก็จะพยายามแจ้งโปรแกรมเมอร์เกี่ยวกับเรื่องนี้ อย่างไรก็ตาม มีการตั้งค่าค่อนข้างมากสำหรับกลไกนี้ ดังนั้นจึงเป็นเรื่องยากสำหรับโปรแกรมเมอร์ที่รู้ PHP ที่จะเข้าใจการตั้งค่าเหล่านี้

เราเห็นข้อผิดพลาด

ดังนั้น เพื่อให้ PHP แสดงข้อผิดพลาดบนหน้าเว็บโดยตรง คุณต้องตั้งค่าพารามิเตอร์พิเศษในโค้ด:

ini_set("display_errors", 1); //display_errors มีหน้าที่แสดงข้อผิดพลาดบนเพจโดยตรง ถ้า 0 – ข้อผิดพลาดจะไม่แสดง

ตอนนี้ หากมีข้อผิดพลาดใดๆ เกิดขึ้นในสคริปต์ ล่ามจะแสดงข้อมูลเกี่ยวกับข้อผิดพลาดนั้นบนเพจ ตัวอย่างเช่น หากคุณเรียกใช้สคริปต์โดยไม่มีฟังก์ชันอยู่:

ini_set("display_errors", 1);
เสียงสะท้อน "

สตริงที่จะแสดง

";
เสียงสะท้อน abrakadabra();
เสียงสะท้อน "

บรรทัดที่จะไม่แสดงเนื่องจากมีข้อผิดพลาด

";

จากนั้นข้อผิดพลาดต่อไปนี้จะปรากฏบนหน้า:

ข้อผิดพลาดร้ายแรง ข้อผิดพลาดประเภทนี้หมายความว่าสคริปต์ถูกขัดจังหวะและโค้ดต่อไปนี้จะไม่ถูกดำเนินการ

การแสดงข้อผิดพลาดของสคริปต์บนเพจใช้เพื่อแก้ไขข้อบกพร่องของสคริปต์เท่านั้น ดังนั้นเมื่อเรียกใช้โค้ดในการผลิต พารามิเตอร์ display_errors จะถูกตั้งค่าเป็น 0

โดยทั่วไปแล้ว ใน PHP มีข้อผิดพลาดประเภทต่างๆ ที่มีนัยสำคัญ: บางส่วนขัดจังหวะการดำเนินการโค้ดเพิ่มเติม - บางส่วนไม่ทำ, บางส่วนสามารถดักจับได้ - บางส่วนไม่สามารถดักจับได้ รายการหมวดหมู่ข้อผิดพลาดทั้งหมดมีดังต่อไปนี้:

ความหมาย
คงที่
คำอธิบาย
โอกาส
1
E_ERROR
ข้อผิดพลาดร้ายแรง
เลขที่
2
E_คำเตือน
ข้อผิดพลาดที่แก้ไขได้
ใช่
4
E_พาร์ส
ข้อผิดพลาดของพาร์เซอร์
เลขที่
8
E_ประกาศ
ข้อผิดพลาดที่อาจเกิดขึ้น
ใช่
16
E_CORE_ERROR
คล้ายกับ E_ERROR แต่สร้างโดยแกน PHP
เลขที่
32
E_CORE_WARNING
คล้ายกับ E_WARNING แต่สร้างโดยแกน PHPเลขที่
64
E_COMPILE_ERROR
คล้ายกับ E_ERROR แต่สร้างโดย Zend Engine
เลขที่
128
E_COMPILE_WARNING
คล้ายกับ E_WARNING แต่สร้างโดย Zend Engineเลขที่
256
E_USER_ERROR
คล้ายกับ E_ERROR แต่ถูกกระตุ้นโดยการเรียก trigger_error()
ใช่
512
E_USER_WARNING
คล้ายกับ E_WARNING แต่ถูกกระตุ้นโดยการเรียก trigger_error()ใช่
1024
E_USER_ประกาศ
คล้ายกับ E_NOTICE แต่ถูกกระตุ้นโดยการเรียก trigger_error()ใช่
2048
E_STRICT
ข้อความจากรันไทม์พร้อมคำแนะนำในการปรับปรุงคุณภาพโค้ด (เริ่มต้นด้วย PHP5)
-
4096
E_RECOVERABLE_ERROR
ข้อผิดพลาดที่เป็นอันตรายแต่ไม่ร้ายแรง (เช่น ประเภทไม่ตรงกัน)
ใช่
8192
E_เลิกใช้แล้ว
คำเตือนคุณลักษณะหรือฟังก์ชันการทำงานที่เลิกใช้แล้ว
ใช่
16384
E_USER_DEPRECATED
คำเตือนฟังก์ชันหรือคุณลักษณะที่เลิกใช้แล้วถูกยกขึ้นในโค้ด
ใช่
32767
อี_ออล
ข้อผิดพลาดทั้งหมด
เลขที่

เพื่อความสะดวก มีการจัดเตรียมค่าคงที่เพื่อกำหนดระดับของการประมวลผลข้อผิดพลาดและสร้างบิตมาสก์ ค่าคงที่มีชื่อที่มีความหมาย เมื่อพิจารณาถึงค่าคงที่ - เราสามารถพูดได้ว่าข้อผิดพลาดระดับ E_PARSE เกิดขึ้นในกรณีที่มีข้อผิดพลาดทางไวยากรณ์ E_NOTICE เป็นเครื่องเตือนใจให้โปรแกรมเมอร์เกี่ยวกับการละเมิด "สไตล์ที่ดี" ของการเขียนโปรแกรม PHP

ตามค่าเริ่มต้น โหมดการสร้างข้อความแสดงข้อผิดพลาดคือ E_ALL & ~E_NOTICE ซึ่งสอดคล้องกับเอาต์พุตของข้อความทั้งหมดที่ไม่ได้จัดประเภทเป็น E_NOTICE โปรแกรมเมอร์สามารถกำหนดหมวดหมู่ข้อผิดพลาดที่ต้องการดูบนหน้าเว็บได้อย่างยืดหยุ่น ในการเปลี่ยนโหมดการสร้างข้อผิดพลาด คุณต้องเปลี่ยนพารามิเตอร์การกำหนดค่า error_reporting หากต้องการเปิดใช้งานการแสดงข้อผิดพลาดใด ๆ คุณต้องตั้งค่า พารามิเตอร์นี้ค่า E_ALL:

ตัวอย่างเช่น ถ้าคุณเรียกใช้รหัสต่อไปนี้:

ini_set("display_errors", 1);
ini_set("error_reporting", E_ALL);

เราจะได้รับข้อผิดพลาดสองประเภทพร้อมกัน (การแจ้งเตือนและคำเตือน):

เมื่อใช้ตัวแปรที่ไม่ได้ประกาศ ข้อผิดพลาด E_NOTICE จะปรากฏขึ้น เมื่อเชื่อมต่อกับฐาน ข้อมูลมายเอสคิวแอล(หรืออื่นๆ) ล้มเหลว - ล่าม PHP รายงานข้อผิดพลาด E_WARNING

ข้อผิดพลาดในการบันทึก

แม้ว่าพารามิเตอร์การกำหนดค่า display_errors จะถูกตั้งค่าเป็น 0 แต่ก็ยังควรสามารถดูได้ว่ามีข้อผิดพลาดใดๆ เกิดขึ้นระหว่างการเรียกใช้สคริปต์หรือไม่ ดังนั้นหากเกิดข้อผิดพลาดเราต้องรู้ว่ามันเกิดขึ้นที่ไหนและทำไม เพื่อวัตถุประสงค์เหล่านี้ PHP มีการตั้งค่าการบันทึกข้อผิดพลาด

ตามค่าเริ่มต้น ข้อผิดพลาดจะไม่ถูกบันทึกทุกที่โดยใช้ภาษา PHP หากต้องการเปลี่ยนแปลง คุณต้องเปลี่ยนพารามิเตอร์การกำหนดค่า log_errors เป็น 1 จาก 0:

ini_set("log_errors", 1);

ในกรณีนี้ ข้อผิดพลาดจะถูกเขียนลงในไฟล์ที่ระบุในพารามิเตอร์การกำหนดค่า error_log โดยอัตโนมัติ พารามิเตอร์ error_log ยังสามารถเปลี่ยนแปลงได้โดยการระบุเส้นทางไปยังไฟล์ที่ต้องการซึ่งข้อผิดพลาดจะถูกบันทึก:

ini_set("error_log", "/var/log/php_errors.log");

ดังนั้นสำหรับรหัส:

ini_set("display_errors", 1);
ini_set("error_reporting", E_ALL);
ini_set("log_errors", 1);
ini_set("error_log", __DIR__ . "/log.txt");
$db = mysql_connect($db_host, "ผู้ใช้", "รหัสผ่าน");

ข้อมูลที่คล้ายกันจะถูกบันทึกไว้ในไฟล์บันทึกและแสดงบนหน้า:

ประกาศเกี่ยวกับ PHP: ตัวแปรที่ไม่ได้กำหนด: db_host ใน Z:\home\test\www\index.php ออนไลน์ 7
คำเตือน PHP: mysql_connect(): การเข้าถึงถูกปฏิเสธสำหรับผู้ใช้ "user"@"localhost" (ใช้รหัสผ่าน: YES) ใน Z:\home\test\www\index.php ออนไลน์ 7

การจัดการข้อผิดพลาด

ข้อผิดพลาดแบ่งออกเป็นที่จับได้และจับไม่ได้ ข้อผิดพลาดที่ไม่ร้ายแรงสามารถตรวจพบได้ด้วยรหัสผู้ใช้ ตารางสรุปคำอธิบายหมวดหมู่ข้อผิดพลาดจะแสดงหมวดหมู่ข้อผิดพลาดที่สามารถตรวจจับได้

เพื่อตรวจจับข้อผิดพลาดที่ไม่สำคัญในโค้ด การนำไปใช้และประกาศก็เพียงพอแล้ว ฟังก์ชั่นของตัวเองและส่งชื่อไปยังฟังก์ชัน set_error_handler ขณะเดียวกันใน ฟังก์ชั่นที่นำไปใช้ส่งผ่านพารามิเตอร์ 5 รายการ:

  • ระดับข้อผิดพลาดเป็นจำนวนเต็ม
  • ข้อความแสดงข้อผิดพลาดเป็นสตริง
  • ชื่อของไฟล์ที่เกิดข้อผิดพลาดเป็นสตริง
  • จำนวนบรรทัดที่เกิดข้อผิดพลาดเป็นจำนวนเต็ม
  • อาร์เรย์ของตัวแปรทั้งหมดที่มีอยู่ในขอบเขตที่เกิดข้อผิดพลาด นอกจากนี้ จะมีการรวมตัวแปรส่วนกลางด้วย
,

บทสรุป

PHP มีเครื่องมืออันทรงพลังสำหรับการจัดการและจัดการการแพร่กระจายข้อผิดพลาดมาตรฐาน ดังนั้นการจับสิ่งนี้หรือข้อผิดพลาดนั้นจึงไม่ใช่เรื่องยากหากกำหนดค่าสคริปต์อย่างถูกต้อง ความรู้ในด้านนี้เป็นส่วนสำคัญสำหรับโปรแกรมเมอร์ PHP เนื่องจากมีโค้ดจำนวนมากใช้กลไกที่อธิบายไว้ข้างต้น


ฉันมักจะได้ยินเกี่ยวกับปัญหานี้จากผู้ใช้รายอื่น เนื่องจากโฮสต์บางส่วนจำเป็นต้องซ่อนข้อผิดพลาดที่ปรากฏ แต่บางคนจำเป็นต้องเข้าใจสิ่งที่เกิดขึ้นกับโค้ดของตนเนื่องจากไม่มีข้อผิดพลาดใด ๆ ปรากฏขึ้น ในบทความนี้ ฉันจะพยายามแสดงวิธีหลักๆ ในการแสดง/ซ่อนข้อผิดพลาด

ใน สคริปต์ PHP 1) PHP มีโอเปอเรเตอร์เพียงตัวเดียวที่รองรับระบบการจัดการข้อผิดพลาด - เครื่องหมาย @ ช่วยให้คุณสามารถละเว้นข้อความแสดงข้อผิดพลาดได้ ต้องวางไว้หน้านิพจน์ที่อาจมีอยู่

มีข้อผิดพลาดโดยเจตนาในตัวอย่าง แต่จะไม่แสดงขึ้น

$value = @$var[$key];
2) คุณยังสามารถแทรกการตั้งค่าสำหรับพารามิเตอร์แสดงข้อผิดพลาด (display_errors) ก่อนที่จะตรวจสอบสคริปต์ PHP โดยอาจรับค่าเป็นเปิด (แสดง) หรือปิด (ซ่อน)

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 ดังนั้นหากมีบางอย่างใช้งานไม่ได้ ให้ลองตรวจดูห่วงโซ่ บางทีอาจมีการตั้งค่าที่แตกต่างออกไป

และเช่นเคย ขอขอบคุณสำหรับความสนใจและขอให้โชคดี! ฉันหวังว่าบทความนี้จะมีประโยชน์!

ฉันกำลังพยายามแยกวิเคราะห์โค้ด HTML5 ดังนั้นฉันจึงสามารถตั้งค่าแอตทริบิวต์/ค่าในโค้ดได้ แต่ดูเหมือนว่า DOMDocument (PHP5.3) จะไม่รองรับแท็ก like และ

มีวิธีแยกวิเคราะห์สิ่งนี้เป็น HTML ใน PHP และจัดการโค้ดหรือไม่

รหัสที่จะเล่น:



2024 wisemotors.ru. วิธีนี้ทำงานอย่างไร. เหล็ก. การทำเหมืองแร่ สกุลเงินดิจิทัล