ในทุกความเป็นจริง PHPแอปพลิเคชัน ข้อผิดพลาด และข้อยกเว้นเกิดขึ้นเป็นครั้งคราว โดยมีคำเตือนและข้อความปรากฏขึ้น หากเราไม่บันทึกข้อมูลนี้ (บันทึก) เมื่อถึงจุดหนึ่งก็จะเป็นไปไม่ได้ที่จะเข้าใจว่าข้อผิดพลาดและข้อยกเว้นเหล่านี้เกิดขึ้นที่ส่วนใดของแอปพลิเคชัน และด้วยเหตุนี้เราจึงไม่สามารถแก้ไขปัญหาเหล่านี้ได้ นอกจากนี้ ยังมีสถานการณ์ที่การบันทึกเหตุการณ์และการดำเนินการเป็นสิ่งที่จำเป็น เช่น ในกรณีที่ผู้ใช้เข้าสู่ระบบและออกจากระบบ เป็นต้น
ใน PHP มีสิ่งอำนวยความสะดวกในการบันทึกที่จำเป็นอยู่แล้ว: การทำงาน error_log()– เพื่อส่งข้อความไปยังบันทึกระบบ, ฟังก์ชั่น set_error_handler()เพื่อสกัดกั้นคำเตือนและข้อผิดพลาด ฟังก์ชันเหล่านี้สามารถใช้สำหรับการจัดการข้อผิดพลาดแบบกำหนดเอง ทำให้นักพัฒนาโค้ดสามารถควบคุมการจัดการข้อผิดพลาดและตรรกะการกรองได้อย่างอิสระ
อย่างไรก็ตาม การเข้าถึงระดับต่ำดังกล่าวส่งผลให้เกิดการทำซ้ำโค้ดบ่อยครั้ง และที่สำคัญกว่านั้น โค้ดดังกล่าวมีแนวโน้มที่จะเกิดข้อผิดพลาดมากกว่า ดังนั้นส่วนประกอบสำเร็จรูปที่ได้รับการทดสอบอย่างดีและพิสูจน์แล้วในสภาวะ "การต่อสู้" จึงมาช่วยเหลือโปรแกรมเมอร์
ส่วนประกอบดังกล่าวได้แก่ ส่วนประกอบ zend-logจาก กรอบ Zend- ส่วนประกอบ zend-logสามารถใช้เป็นส่วนประกอบการบันทึกอเนกประสงค์ซึ่งเป็นช่องทางการค้าทุกประเภท รองรับรูปแบบข้อความบันทึกและฐานข้อมูลการบันทึกประเภทต่างๆ (ไฟล์ ฐานข้อมูล) รวมถึงมีระบบกรองข้อความที่ซับซ้อนและอื่นๆ อีกมากมาย อีกด้วย zend-logเข้ากันได้กับ PSR-3มาตรฐานการบันทึก ติดตั้งดังนี้:
ผู้แต่งต้องการ zendframework/zend-log
มันถูกใช้ดังต่อไปนี้ (ตัวอย่างเช่น ใช้ไฟล์ index.php ในรูทโปรเจ็กต์):
ต้องการ "vendor/autoload.php";
ใช้ Zend\Log\Logger;
ใช้ Zend\Log\Writer\Stream;
$logger = คนตัดไม้ใหม่;
// ส่งข้อผิดพลาดไปยังคอนโซล
$writer = กระแสใหม่("php://ouput");
$logger -> addWriter($นักเขียน);
$logger -> log(Logger::INFO,"ข้อมูลบางส่วน");
ผลลัพธ์ของการรันโค้ดด้านบน:
2017-09-26T10:40:34+03:00 INFO(6): ข้อมูลบางส่วน
บรรทัดสรุปประกอบด้วยเวลาของกิจกรรม ลำดับความสำคัญ และข้อความ แน่นอนว่ารูปแบบของข้อความเอาท์พุตสามารถเปลี่ยนแปลงได้ หากจำเป็น โดยใช้วิธีนี้ ตั้งค่าฟอร์แมตเตอร์()- ตามค่าเริ่มต้น บรรทัดบันทึกจะอธิบายตามรูปแบบต่อไปนี้:
%ประทับเวลา% %priorityName% (%priority%): %ข้อความ% %พิเศษ%
- %timestamp% คือการประทับเวลา
- %priorityName% - ป้ายข้อความลำดับความสำคัญ
- %priority% - ป้ายลำดับความสำคัญที่เป็นตัวเลข
- %ข้อความ% - ข้อความ
- %พิเศษ% - ค่าเผื่อเลือกสำหรับข้อมูลเพิ่มเติม
หากคุณต้องการเปลี่ยนรูปแบบข้อความ ให้ทำดังนี้:
$formatter = new Zend\Log\Formatter\Simple("ข้อความ %ข้อความ%" . PHP_EOL);
$writer -> setFormatter($formatter);
ส่วนประกอบ zend-logยังสามารถใช้เพื่อบันทึกข้อผิดพลาดและข้อยกเว้นจากล่าม PHP เอง เมื่อต้องการทำเช่นนี้ มีสองวิธีแบบคงที่ในคลาส Logger: คนตัดไม้::registerErrorHandler($คนตัดไม้)– เพื่อสกัดกั้นข้อผิดพลาดและ คนตัดไม้::registerExceptionHandler($คนตัดไม้)- เพื่อจับข้อยกเว้น
ใช้ Zend\Log\Logger;
ใช้ Zend\Log\Writer;
$logger = คนตัดไม้ใหม่;
$writer = ตัวเขียนใหม่\สตรีม(__DIR__ . "/test.log");
$logger->addWriter($นักเขียน);
// บันทึกข้อผิดพลาด
คนตัดไม้::registerErrorHandler($คนตัดไม้);
// บันทึกข้อยกเว้น
คนตัดไม้::registerExceptionHandler($คนตัดไม้);
ตามที่กล่าวไว้ข้างต้น zend-logช่วยให้เราสามารถกรองข้อความสำหรับการบันทึกได้ เช่น ก่อนที่จะเขียนข้อความลงในบันทึก เราจะสามารถดูว่าข้อความนั้นตรงตามเกณฑ์ของเราหรือไม่ และหากเป็นเช่นนั้น เราจะเขียนข้อความนั้น
นี่คือตัวอย่าง:
$filter = ใหม่ Zend\Log\Filter\Priority(Logger::CRIT);
// วิธีการ addFilter ของอินเทอร์เฟซ Writer
$writer->addFilter($ตัวกรอง);
ในตัวอย่างนี้ เราจะบันทึกเฉพาะข้อความที่มีลำดับความสำคัญน้อยกว่าหรือเท่ากับวิกฤติ ( คนตัดไม้::CRIT).
รายการลำดับความสำคัญทั้งหมดที่กำหนดไว้ในชั้นเรียน Zend\Log\Logger:
ค่าคงที่ EMERG = 0; // สัญญาณเตือน: ระบบใช้งานไม่ได้
const การแจ้งเตือน = 1; // สัญญาณเตือน: จำเป็นต้องดำเนินการอย่างเร่งด่วน
ค่า CRIT = 2; //สถานการณ์วิกฤติ
ข้อผิดพลาด const = 3; // ข้อผิดพลาด
คำเตือน const = 4; // คำเตือน
ประกาศ const = 5; // ความสนใจ
ข้อมูล const = 6; // ข้อมูล
const DEBUG = 7; // ดีบัก, ดีบัก
นอกจากนี้เรายังสามารถกรองข้อความตามนิพจน์ทั่วไป การประทับเวลา ฯลฯ ดังนั้น, เข้าสู่ระบบ PHP- นี่เป็นสิ่งสำคัญและบางครั้งจำเป็นในการพัฒนา แอปพลิเคชันเว็บ.
คำถามส่วนใหญ่บนเว็บไซต์จะขึ้นต้นด้วย “ช่วยด้วย มันใช้งานไม่ได้ มันจะไม่เริ่ม...” คำตอบทั้งหมดขึ้นอยู่กับคำแนะนำและคำแนะนำ แต่ฉันไม่รู้ว่าทำไมฉันถึงไม่เขียนบทความเกี่ยวกับวิธีการและตำแหน่งที่จะค้นหาข้อผิดพลาดหรือเกี่ยวกับการใช้บันทึก ดังนั้นเราจึงเติมเต็มช่องว่างและแนะนำให้ทุกคนอ่านบทความนี้
บันทึก (บันทึก) - (ภาษาอังกฤษ) บันทึกคุณอาจเคยเจอไฟล์มาก่อน *.บันทึก) ตามกฎแล้ว ไฟล์ข้อความที่มีรายการเหตุการณ์ บันทึกเหตุการณ์ ไดอารี่ บันทึก โปรโตคอล ฯลฯ ตามลำดับเวลา บันทึกถูกสร้างขึ้นโดยโปรแกรม บริการ และระบบปฏิบัติการต่างๆ แต่ละโปรแกรมสามารถมีบันทึกของตนเองได้ (ไฟล์ข้อความ)
เมื่อพัฒนาเว็บไซต์ บันทึกที่สร้างขึ้นจะมีคุณค่าสำหรับนักพัฒนาเว็บ:
1. บันทึกระดับระบบปฏิบัติการ:
- คอมพิวเตอร์ของฉัน - แผงควบคุม - เครื่องมือการดูแลระบบ - โปรแกรมดูเหตุการณ์
- คอมพิวเตอร์ของฉัน - เรียกใช้ - "eventvwr.msc"
ซึ่งรวมถึงบันทึกเหตุการณ์ทั้งหมดในระบบปฏิบัติการ Windows รวมถึงที่นี่บนแท็บ:
- มุมมองที่กำหนดเอง / กิจกรรมการดูแลระบบ
- บันทึก Windows/ระบบ
คุณสามารถค้นหาบันทึกที่เกี่ยวข้องกับบริการ Apache (หากเว็บเซิร์ฟเวอร์ Apache ทำงานเป็นบริการ) และข้อผิดพลาดอื่นๆ ที่เกิดขึ้น เช่น จากส่วนขยาย php โดยทั่วไปแล้ว ข้อผิดพลาด Windows ทั้งหมดจะถูกป้อนที่นี่ Apache ในฐานะบริการถือว่าเป็นส่วนหนึ่งของ Windows ดังนั้นหากมีข้อผิดพลาดเกิดขึ้นเมื่อเริ่มบริการ Apache คุณต้องค้นหาคำอธิบายของข้อผิดพลาดนี้ที่นี่ ถัดไป หากการถอดรหัสข้อผิดพลาดในบันทึกไม่อนุญาตให้คุณเข้าใจว่าปัญหาที่แท้จริงคืออะไร ให้คัดลอกส่วนหลักของบันทึกลงใน Google และค้นหาปัญหาที่คล้ายกัน เป็นไปได้มากว่าคุณจะพบคำตอบที่จะช่วยคุณได้ เมื่อเริ่มเกม โปรแกรม บริการ เมื่อมีข้อผิดพลาดเกิดขึ้น รายการใหม่จะปรากฏในบันทึกพร้อมคำอธิบายข้อผิดพลาดโดยละเอียดเพิ่มเติม จากนี้ คุณจะพบคำตอบบนอินเทอร์เน็ตได้ตลอดเวลา
2. บันทึกระดับ Apache:
นอกเหนือจากบันทึกของ Windows แล้ว Apache เองยังสร้างบันทึกของตนเองในรูปแบบของไฟล์ข้อความ เมื่อติดตั้งและกำหนดค่าเว็บเซิร์ฟเวอร์ Apache ในไฟล์ httpd.confมีบรรทัด: ErrorLog "C:/apache/error.log" โดยที่ "C:/apache/error.log" เป็นเส้นทางไปยังไฟล์บันทึกของเว็บเซิร์ฟเวอร์ Apache กำหนดเส้นทางของคุณหรือจำไว้ว่าหากเกิดข้อผิดพลาดเมื่อเริ่มต้น Apache คุณต้องเปิดไฟล์นี้และค้นหารายการล่าสุดซึ่งจะสะท้อนถึงสาเหตุของข้อผิดพลาด นอกจากนี้ เว็บเซิร์ฟเวอร์ Apache ยังให้คุณสร้างบันทึกแยกกันสำหรับโฮสต์เสมือนแต่ละโฮสต์ได้ ตัวอย่างโฮสต์เสมือนในไฟล์ conf/พิเศษ/httpd-vhosts.conf:
DocumentRoot "C:/apache/symfony/www/web"
ซิมโฟนีชื่อเซิร์ฟเวอร์
ServerAlias www.symfony
บันทึกข้อผิดพลาด "C:/apache/symfony/error.log"
CustomLog "C:/apache/symfony/access.log" ทั่วไป
DocumentRoot "C:/apache/phpmyadmin"
ชื่อเซิร์ฟเวอร์ phpmyadmin
ServerAlias www.phpmyadmin
บันทึกข้อผิดพลาด "C:/apache/phpmyadmin/error.log"
CustomLog "C:/apache/phpmyadmin/access.log" ทั่วไป
3. บันทึกระดับ php:
เมื่อตั้งค่าคอนฟิก php ในไฟล์ php.iniเพื่อกำหนดค่าการแสดงบันทึก เราจะพบบรรทัดต่อไปนี้:
error_reporting = E_ALL & ˜E_NOTICE & ˜E_STRICT //ประเภทและประเภทของข้อผิดพลาดที่แสดงการบันทึก
log_errors = เปิด //เปิดการบันทึก
log_errors_max_len = 1,024 //กำหนดขนาดสูงสุดของไฟล์บันทึก (1,024 ไบต์)
error_log = php_errors.log //ระบุชื่อไฟล์ที่จะบันทึกบันทึก ไฟล์เหล่านี้จะถูกสร้างขึ้นในรูทของโฮสต์เสมือนของคุณ ไฟล์แยกจะถูกสร้างขึ้นสำหรับแต่ละโฮสต์
นอกจากข้อเท็จจริงที่ว่าข้อผิดพลาด PHP ทั้งหมดจะถูกบันทึกไว้ในไฟล์ คุณยังสามารถสร้างบันทึกระหว่างการดำเนินการสคริปต์ PHP โดยใช้ฟังก์ชัน error_log สิ่งนี้มีประโยชน์หากคุณใช้ try ... catch ในโค้ดของคุณ ซึ่งในกรณีนี้สคริปต์จะไม่ยุติลงในกรณีที่เกิดข้อผิดพลาดร้ายแรง และข้อผิดพลาดที่ไม่คาดคิดทั้งหมดจะถูกบันทึกไว้ในบันทึกเสมอ
พยายาม (
$อาร์ = 5/0;
) catch (ยกเว้น $exc) (
error_log($exc->getMessage());
}
ขึ้นอยู่กับผลลัพธ์ของการรันโค้ดนี้ไฟล์บันทึก php_errors.logบรรทัดที่คล้ายกันนี้จะถูกแทรก:
คำเตือน PHP: หารด้วยศูนย์ใน C:\apache\test\www\index.php ออนไลน์ 5
เพียงเท่านี้ ให้ใช้บันทึกทุกครั้งที่เป็นไปได้ แล้วคุณจะพบข้อผิดพลาดในโค้ดและสาเหตุของการประมวลผลข้อมูลที่ไม่ถูกต้องอย่างรวดเร็ว
483การเข้าสู่ระบบ PHP หมายถึงข้อผิดพลาดประเภทใดที่เว็บแอปพลิเคชัน/ไซต์/สคริปต์ php ของคุณจะรายงานให้คุณทราบและอย่างไร
มี 2 (3) วิธีหลักในการรับข้อผิดพลาดจากแอปพลิเคชัน:
- การแสดงข้อผิดพลาดเหล่านี้บนหน้าจอโดยตรง
- การบันทึกข้อผิดพลาดเหล่านี้ลงในไฟล์บันทึกพิเศษ
- หรือทั้งสองตัวเลือกพร้อมกัน: การแสดงข้อผิดพลาดเหล่านี้บนหน้าจอและบันทึกลงในไฟล์บันทึกพิเศษ
ตามกฎแล้ว ในทางปฏิบัติแล้วในระหว่างการพัฒนา (ในสภาพแวดล้อมท้องถิ่น) ข้อผิดพลาดทั้งหมดจะแสดงบนหน้าจอโดยตรง เพื่อให้จับและแก้ไขได้ง่ายและรวดเร็วยิ่งขึ้น แต่ข้อผิดพลาดในสภาพแวดล้อมการผลิต (ในการผลิต) จะไม่เป็นเช่นนั้น แสดงเลย (เนื่องจากผู้ใช้เป็นข้อมูลที่ไม่มีประโยชน์) และข้อมูลทั้งหมดเกี่ยวกับพวกเขาจะถูกเขียนลงในไฟล์บันทึกซึ่งนักพัฒนาซอฟต์แวร์จะตรวจสอบเป็นประจำ
การตั้งค่าสำหรับการบันทึกข้อผิดพลาด
- ข้อผิดพลาด_การรายงาน- นี่คือพารามิเตอร์ที่สำคัญที่สุด มีหน้าที่รับผิดชอบว่าจะแสดง/เขียนข้อความแสดงข้อผิดพลาดประเภทใดลงในไฟล์บันทึก ฉันเชื่อว่ามีเพียง 2 ตัวเลือกเท่านั้นที่สามารถใช้ได้:
- -1 (หรือ E_ALL) - รายงานข้อผิดพลาดทุกประเภท
- 0 - ไม่มีการรายงานข้อผิดพลาดประเภทต่างๆ
ฉันแนะนำให้ใช้ -1 (หรือ E_ALL) โดยเฉพาะ
เพราะ โดยหลักการแล้วแอปพลิเคชันไม่ควรมีข้อผิดพลาดใดๆ ตัวเลือกนี้สามารถตั้งค่าผ่านไฟล์กำหนดค่าใน php.ini หรือโดยตรงในสคริปต์ php โดยการเรียกใช้ฟังก์ชัน ข้อผิดพลาด_การรายงาน:Error_reporting(-1); error_reporting(E_ALL);
อย่างไรก็ตาม นี่เป็นตัวเลือกเดียวที่มีอยู่ในภาษา PHP เป็นฟังก์ชัน ตัวเลือกอื่นๆ ทั้งหมดสามารถตั้งค่าได้โดยการแก้ไขไฟล์การกำหนดค่า php.ini หรือการเรียกใช้ฟังก์ชันเท่านั้น ini_set()ส่งผ่านพารามิเตอร์ที่ต้องการและค่าของมันตามลำดับ
- display_errors— พารามิเตอร์นี้มีหน้าที่ในการแสดงข้อผิดพลาดบนหน้าจอโดยตรงหลังจากที่เกิดขึ้นจริง พารามิเตอร์นี้สามารถมีค่า 0 หรือ 1 หรือเปิด / ปิด เหล่านั้น. แสดงข้อผิดพลาดบนหน้าจอหรือไม่
- display_startup_errors- ตัวเลือกนี้มีหน้าที่ในการแสดงข้อผิดพลาดที่เกิดขึ้นหลังจากเปิดตัว PHP ตัวอย่างเช่น หากมีข้อผิดพลาดทางไวยากรณ์ในไฟล์การกำหนดค่า ข้อมูลเกี่ยวกับข้อผิดพลาดนั้นจะปรากฏขึ้น พารามิเตอร์นี้สามารถมีค่า 0 หรือ 1 หรือเปิด / ปิด
- log_errors— คำสั่งนี้มีหน้าที่รับผิดชอบในการเขียนข้อความแสดงข้อผิดพลาดลงในไฟล์บันทึก พารามิเตอร์นี้สามารถมีค่า 0 หรือ 1 หรือเปิด / ปิด เหล่านั้น. บันทึกข้อผิดพลาดหรือไม่
- error_log— การตั้งค่านี้รับผิดชอบเส้นทางไปยังไฟล์ (ไฟล์บันทึก) ซึ่งข้อผิดพลาดของแอปพลิเคชันทั้งหมดที่เกิดขึ้นจะถูกบันทึก
- html_errors— ตัวเลือกเดียวกันนี้รับผิดชอบรูปแบบในการแสดงข้อผิดพลาดของแอปพลิเคชัน หากตั้งค่าเป็น 1 หรือเปิด ข้อผิดพลาดจะแสดงโดยใช้ HTML เช่น จะมีร่องรอยของต้นกำเนิดของข้อผิดพลาดและทุกอย่างจะค่อนข้างให้ข้อมูลและมีสีสัน หากค่าของการตั้งค่านี้เป็น 0 หรือปิด ข้อผิดพลาดจะแสดงเป็นข้อความธรรมดาในจำนวนบรรทัดเล็กๆ
1. การตั้งค่าสำหรับการแสดงข้อผิดพลาดบนหน้าจอ
ini_set("html_errors", 1);
ini_set("log_errors", 0);
2. การตั้งค่าสำหรับการบันทึกข้อผิดพลาดในไฟล์บันทึก
Error_reporting(-1); // ini_set("error_reporting", -1);
ini_set("display_errors", 0);
ini_set("display_startup_errors", 0);
ini_set("log_errors", 1);
3. การตั้งค่าสำหรับการแสดงข้อผิดพลาดพร้อมกันและบันทึกลงในไฟล์บันทึก
Error_reporting(-1); // ini_set("error_reporting", -1);
ini_set("display_errors", 1);
ini_set("display_startup_errors", 1);
ini_set("log_errors", 1);
ini_set("html_errors", 1);
ini_set("error_log", "/var/log/php/error.log");
นอกจากนี้ ตัวเลือกเหล่านี้สามารถตั้งค่าได้ในไฟล์กำหนดค่า php.ini หรือในไฟล์โฮสต์เสมือนของคุณ
มีบริการจำนวนมากบนอินเทอร์เน็ตที่ให้บริการติดตามปริมาณการเข้าชมเว็บไซต์ของคุณ บริการเหล่านี้มีทั้งแบบเสียค่าธรรมเนียมและฟรี ตัวอย่างเช่น เราสามารถอ้างอิง LiveInternet บริการนี้ค่อนข้างแพร่หลายบนอินเทอร์เน็ตและเกือบทุกไซต์ใช้บริการของตน เจ้าของมีสถิติโดยละเอียดเกี่ยวกับการเข้าชมเว็บไซต์ของเขา
ไม่ต้องสงสัยเลย! บริการเหล่านี้ขาดไม่ได้ในการบันทึกการเข้าชมเว็บไซต์และศึกษาพฤติกรรมของผู้ใช้เพิ่มเติม แต่ในบทความนี้ ฉันอยากจะบอกคุณว่าคุณสามารถสร้างไฟล์บันทึกการเข้าชมของผู้เยี่ยมชมบนเซิร์ฟเวอร์ได้อย่างไร
เยี่ยมชมไฟล์บันทึก
ไฟล์บันทึกนี้จะมีประโยชน์มากสำหรับการบันทึกการเข้าชมและการดูเว็บไซต์ของคุณโดยผู้เยี่ยมชม ในการสร้างไฟล์บันทึก จะใช้สคริปต์ที่เขียนด้วย PHP สคริปต์นี้ค่อนข้างเข้าใจง่ายและติดตั้งบนเว็บไซต์
สคริปต์ PHP เพื่อสร้างไฟล์บันทึก
สคริปต์บันทึกเวลาที่แน่นอนในการเข้าสู่ไซต์ กำหนดเบราว์เซอร์ของผู้เยี่ยมชม และที่สำคัญที่สุดคือกำหนดว่าผู้เยี่ยมชมมาหาคุณจากที่ใด ไฟล์บันทึกจะถูกบันทึกทุกครั้งที่มีการแสดงหน้าใดหน้าหนึ่งของเว็บไซต์ นั่นคือเจ้าของไซต์สามารถดูในไฟล์บันทึกว่าผู้เยี่ยมชมดูหน้าใดของไซต์ที่ IP และเวลาที่ระบุโดยใช้เบราว์เซอร์เฉพาะ
รายการสคริปต์สำหรับเขียนข้อมูลลงในไฟล์บันทึก
$er_time=date("H:i:s d M Y"); // Записываем текущую дату обращения на сайт $U=getenv("HTTP_USER_AGENT"); // Узнаем какой браузер использует посетитель $H=getenv("HTTP_REFERER"); // Получаем адрес ulr откуда прищел посетитель $R=getenv("REMOTE_ADDR"); // Получаем IP адрес посетителя $W=getenv("REQUEST_URI"); // Получаем адрес страницы, которую запросил пользователь $f=fopen("logs/users.log","a"); // Указываем путь до лог-файла flock ($f,2); fwrite($f,"$er_time\n Br: $U\n Rf: $H\n IP: $R\n Rq: $W\r\n"); // Запись полученных данных в файл \r\n\ указывает на запись с новой строчки в файле. Данная операция будет выполняться при каждом открытие страницы. fclose($f); // Закрытие файла?>การติดตั้งสคริปต์
บันทึกสคริปต์ในเทมเพลตหรือในไฟล์ภายนอก users.php หากต้องการแทรกสคริปต์ลงในเพจ ให้ใช้โค้ดต่อไปนี้
บนไซต์ที่ร้ายแรง เป็นเรื่องแปลกที่เห็นข้อผิดพลาดที่แสดงต่อผู้ใช้ในเบราว์เซอร์ในตำแหน่งที่ไม่คาดคิดที่สุด เหตุใดจึงปรากฏเป็นการสนทนาที่แยกจากกัน แต่ทำไมพวกเขาถึงแสดง?
ท้ายที่สุดแล้ว ข้อความแสดงข้อผิดพลาดนั้นเป็นข้อมูลสำหรับการดีบักและมีไว้สำหรับนักพัฒนา ไม่ใช่ลูกค้า
นอกจากนี้ยังเป็นข้อมูลที่เป็นกรรมสิทธิ์ซึ่งมักจะช่วยให้แฮกเกอร์ผู้ชั่วร้ายทำลายไซต์ได้ ตัวอย่างคลาสสิกคือตัวเลือกในการแสดงข้อความค้นหาเมื่อมีข้อผิดพลาด: "คุณมีข้อผิดพลาดในข้อความค้นหาใกล้กับ WHERE id= " ... ขอบคุณมาก หลังจาก "WHERE id=..." เราจะแทนที่สตริง "0 OR 1>0" และแบบสอบถามจะดำเนินการทั่วทั้งตาราง หากเป็นการร้องขอให้ลบออกล่ะก็...รู้ไหมว่ามันสนุก =) นั่นเป็นเหตุผลที่ฉันมักจะใส่ตัวแปรในการสืบค้นด้วยเครื่องหมายคำพูด เพียงในกรณีที่...
แต่ฉันถูกพาไป นั่นไม่ใช่สิ่งที่เรากำลังพูดถึงในวันนี้ วันนี้เราจะพูดถึงวิธีหลีกเลี่ยงการแสดงข้อผิดพลาดแก่ลูกค้า พร้อมทั้งบันทึกข้อความทั้งหมดถึงผู้ดูแลเว็บไว้เป็นที่ระลึก
เริ่มต้นด้วยภาพรวมโดยย่อเกี่ยวกับประเภทของข้อผิดพลาดใน PHPตารางที่ 1. คำอธิบายข้อผิดพลาดใน PHP4(รายการเดิม) ตัวเลข |
ความหมาย | คงที่ | คำอธิบาย |
---|---|---|---|
1 | จับได้/ไม่ | ข้อผิดพลาดร้ายแรง เช่น เกิดข้อผิดพลาดขณะเข้าถึงหน่วยความจำ การดำเนินการของสคริปต์ถูกขัดจังหวะ | เลขที่ |
2 | E_คำเตือน | คำเตือน (ไม่ใช่ข้อผิดพลาดร้ายแรง) การดำเนินการสคริปต์ไม่ถูกขัดจังหวะ | ใช่ |
4 | E_พาร์ส | ข้อผิดพลาดระหว่างการแยกวิเคราะห์ไวยากรณ์ สร้างโดยโปรแกรมแยกวิเคราะห์ | เลขที่ |
8 | E_ประกาศ | หมายเหตุ (ข้อผิดพลาดร้ายแรงน้อยกว่าคำเตือน) ระบุสถานการณ์ที่อาจก่อให้เกิดข้อผิดพลาดร้ายแรงยิ่งขึ้น แต่ก็สามารถเกิดขึ้นได้ในระหว่างการทำงานของสคริปต์ปกติเช่นกัน | ใช่ |
16 | E_CORE_ERROR | เกิดข้อผิดพลาดขณะดาวน์โหลด PHP คล้ายกับ E_ERROR ที่สร้างโดยเคอร์เนล PHP | เลขที่ |
32 | E_CORE_WARNING | คำเตือนระหว่างการโหลด PHP คล้ายกับ E_WARNING ที่สร้างโดยเคอร์เนล PHP | เลขที่ |
64 | E_COMPILE_ERROR | ข้อผิดพลาดร้ายแรงระหว่างการคอมไพล์โค้ด อะนาล็อกของ E_ERROR ที่สร้างโดยเอ็นจิ้น Zend | เลขที่ |
128 | E_COMPILE_WARNING | คำเตือนระหว่างการคอมไพล์โค้ด อะนาล็อกของ E_WARNING ที่สร้างโดยเครื่องยนต์ Zend | เลขที่ |
256 | E_USER_ERROR | ข้อผิดพลาดของผู้ใช้ | ใช่ |
512 | E_USER_WARNING | คำเตือนผู้ใช้ | ใช่ |
1024 | E_USER_ประกาศ | หมายเหตุผู้ใช้ | ใช่ |
เราสนใจข้อผิดพลาดเหล่านั้นที่เราสามารถสกัดกั้นได้ ซึ่งรวมถึง: E_WARNING, E_NOTICE และ E_USER_* ข้อผิดพลาดประเภทอื่นไม่สามารถดักจับได้เนื่องจากเกิดขึ้นก่อนที่เคอร์เนล PHP จะโหลดเสร็จหรือเนื่องจากข้อผิดพลาดเกิดขึ้นในขั้นตอนการแยกวิเคราะห์และรวบรวมโค้ด PHP ดังนั้นจึงต้องปิดเอาต์พุต:
ini_set("display_errors",0);แต่ฉันคิดว่าสคริปต์ของเราได้รับการดีบั๊กเพียงพอจนไม่มีข้อผิดพลาดทางไวยากรณ์พื้นฐาน ดังนั้นเราจึงไม่ควรสูญเสียสิ่งใดไป
อัตราข้อผิดพลาดเริ่มต้นใน PHP คือ E_ALL & ~E_NOTICE (หรือ 2039 ในรูปแบบตัวเลข) ซึ่งหมายความว่าเราเพิกเฉยต่อความคิดเห็น แต่รายงานข้อผิดพลาดอื่นๆ ทั้งหมด
ดังนั้น เรามาเปลี่ยนระดับเอาต์พุตข้อผิดพลาดเป็น E_ALL:
error_reporting(E_ALL);ตอนนี้เรามากำหนดตัวจัดการข้อผิดพลาดใหม่และแทนที่ฟังก์ชันของเราแทน ซึ่งจะจัดการการจัดการข้อผิดพลาด:
set_error_handler("user_log");มาดูฟังก์ชั่นนี้กันดีกว่า มันผ่าน 5 พารามิเตอร์:
- รหัสข้อผิดพลาด
- ข้อความแสดงข้อผิดพลาด
- ชื่อของไฟล์ที่เกิดข้อผิดพลาด
- บรรทัดในไฟล์
- อาร์เรย์ตัวแปร
ฟังก์ชันนี้ไม่จำเป็นต้องส่งคืนสิ่งใดๆ เนื่องจากเราจะดูบันทึกข้อผิดพลาดในภายหลัง เราจึงต้องบันทึกบันทึกดังกล่าวในไฟล์เพื่อให้สะดวกสำหรับเราในการทำงานกับมันในภายหลัง
=(LOG_FILE_MAXSIZE*1024)) ( //ตรวจสอบการตั้งค่า หากตั้งค่า log_rotate ไว้ // จากนั้น "เลื่อน" ไฟล์เก่าลงหนึ่งไฟล์และสร้างบันทึกเปล่า // ถ้าไม่ ให้ล้างและเขียนแทนบันทึกเก่าหาก ( LOG_ROTATE===true ) ( $i=1; //นับบันทึกเก่าในไดเรกทอรีในขณะที่ (is_file(LOG_FILE_NAME.".".$i)) ( $i++; ) $i--; //สำหรับแต่ละรายการ ในทางกลับกัน เราจะเพิ่มตัวเลข 1 ในขณะที่ ($i>0) ( rename(LOG_FILE_NAME"..".$i,LOG_FILE_NAME" .(1+$i--)); ) rename (LOG_FILE_NAME,LOG_FILE_NAME" .1"); (LOG_FILE_NAME); ) elseif(is_file(LOG_FILE_NAME)) ( //ถ้าเราเขียนบันทึกจากด้านบน เราจะลบ // และสร้างไฟล์ว่างขึ้นใหม่ ยกเลิกการเชื่อมโยง(LOG_FILE_NAME); touch(LOG_FILE_NAME); ) ) /* ตรวจสอบว่ามีไฟล์ดังกล่าวอยู่หรือไม่หากไม่มี - เราจะสร้างมันได้หรือไม่หากมีอยู่ - เราจะเขียนลงไปได้ไหม */ if(!is_file(LOG_FILE_NAME)) ( if (!touch(LOG_FILE_NAME)) ( return "can\" t create log file"; ) ) elseif( !is_writable(LOG_FILE_NAME)) ( return "can\"t write to log file"; ) //ใส่ใจกับฟังก์ชันที่เราใช้ในการเขียน log file.
error_log($err_str, 3, LOG_FILE_NAME); -
แน่นอนว่าเป็นไปได้ที่จะใช้ที่เก็บข้อมูลแบบลอจิคัลมากขึ้นเพื่อวัตถุประสงค์ดังกล่าว - ฐานข้อมูล แต่ข้อผิดพลาดส่วนใหญ่เกิดขึ้นเมื่อทำงานกับฐานข้อมูลอย่างแม่นยำดังนั้นฉันจะไม่พึ่งพามัน
จริงๆแล้วนั่นคือทั้งหมดที่ ฉันคิดว่าที่เหลือคงไม่ใช่เรื่องยากสำหรับคุณโดยเฉพาะถ้าคุณใช้ไฟล์ (); &ระเบิด(); - และหากเป็นเช่นนั้น คุณสามารถใช้ [รหัสนี้]
เมื่อคาดการณ์ถึงคำถามที่ว่า “ทำไมฉันถึงไม่ใช้ CSV ซึ่งดูสมเหตุสมผลที่จะใช้ในสถานการณ์นี้” ฉันตอบ: ข้อความแสดงข้อผิดพลาดอาจมีอักขระบริการที่ไม่รู้จักจำนวนหนึ่ง (หรือที่เรียกว่าเครื่องหมายจุลภาคและอัฒภาค) ซึ่งจะทำให้การแยกวิเคราะห์ CSV ซับซ้อนอย่างเห็นได้ชัด และฉันจะไม่ดูบันทึกใน Excel
- ความคิดอื่น ๆ ในหัวข้อนี้:
- เมื่อบันทึก gz ล้าสมัย ให้ ip ไฟล์และใส่ไว้ในไฟล์เก็บถาวร
- เหมือนกัน แต่มีพัสดุส่งถึงที่ทำการไปรษณีย์