การบันทึกข้อผิดพลาด php เข้าสู่ระบบ PHP โดยใช้ Zend Log สคริปต์ PHP เพื่อสร้างไฟล์บันทึก

ในทุกความเป็นจริง 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%): %ข้อความ% %พิเศษ%

  1. %timestamp% คือการประทับเวลา
  2. %priorityName% - ป้ายข้อความลำดับความสำคัญ
  3. %priority% - ป้ายลำดับความสำคัญที่เป็นตัวเลข
  4. %ข้อความ% - ข้อความ
  5. %พิเศษ% - ค่าเผื่อเลือกสำหรับข้อมูลเพิ่มเติม

หากคุณต้องการเปลี่ยนรูปแบบข้อความ ให้ทำดังนี้:

$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) วิธีหลักในการรับข้อผิดพลาดจากแอปพลิเคชัน:

  1. การแสดงข้อผิดพลาดเหล่านี้บนหน้าจอโดยตรง
  2. การบันทึกข้อผิดพลาดเหล่านี้ลงในไฟล์บันทึกพิเศษ
  3. หรือทั้งสองตัวเลือกพร้อมกัน: การแสดงข้อผิดพลาดเหล่านี้บนหน้าจอและบันทึกลงในไฟล์บันทึกพิเศษ

ตามกฎแล้ว ในทางปฏิบัติแล้วในระหว่างการพัฒนา (ในสภาพแวดล้อมท้องถิ่น) ข้อผิดพลาดทั้งหมดจะแสดงบนหน้าจอโดยตรง เพื่อให้จับและแก้ไขได้ง่ายและรวดเร็วยิ่งขึ้น แต่ข้อผิดพลาดในสภาพแวดล้อมการผลิต (ในการผลิต) จะไม่เป็นเช่นนั้น แสดงเลย (เนื่องจากผู้ใช้เป็นข้อมูลที่ไม่มีประโยชน์) และข้อมูลทั้งหมดเกี่ยวกับพวกเขาจะถูกเขียนลงในไฟล์บันทึกซึ่งนักพัฒนาซอฟต์แวร์จะตรวจสอบเป็นประจำ

การตั้งค่าสำหรับการบันทึกข้อผิดพลาด

  1. ข้อผิดพลาด_การรายงาน- นี่คือพารามิเตอร์ที่สำคัญที่สุด มีหน้าที่รับผิดชอบว่าจะแสดง/เขียนข้อความแสดงข้อผิดพลาดประเภทใดลงในไฟล์บันทึก ฉันเชื่อว่ามีเพียง 2 ตัวเลือกเท่านั้นที่สามารถใช้ได้:
    • -1 (หรือ E_ALL) - รายงานข้อผิดพลาดทุกประเภท
    • 0 - ไม่มีการรายงานข้อผิดพลาดประเภทต่างๆ

    ฉันแนะนำให้ใช้ -1 (หรือ E_ALL) โดยเฉพาะ
    เพราะ โดยหลักการแล้วแอปพลิเคชันไม่ควรมีข้อผิดพลาดใดๆ ตัวเลือกนี้สามารถตั้งค่าผ่านไฟล์กำหนดค่าใน php.ini หรือโดยตรงในสคริปต์ php โดยการเรียกใช้ฟังก์ชัน ข้อผิดพลาด_การรายงาน:

    Error_reporting(-1); error_reporting(E_ALL);

    อย่างไรก็ตาม นี่เป็นตัวเลือกเดียวที่มีอยู่ในภาษา PHP เป็นฟังก์ชัน ตัวเลือกอื่นๆ ทั้งหมดสามารถตั้งค่าได้โดยการแก้ไขไฟล์การกำหนดค่า php.ini หรือการเรียกใช้ฟังก์ชันเท่านั้น ini_set()ส่งผ่านพารามิเตอร์ที่ต้องการและค่าของมันตามลำดับ

  2. display_errors— พารามิเตอร์นี้มีหน้าที่ในการแสดงข้อผิดพลาดบนหน้าจอโดยตรงหลังจากที่เกิดขึ้นจริง พารามิเตอร์นี้สามารถมีค่า 0 หรือ 1 หรือเปิด / ปิด เหล่านั้น. แสดงข้อผิดพลาดบนหน้าจอหรือไม่
  3. display_startup_errors- ตัวเลือกนี้มีหน้าที่ในการแสดงข้อผิดพลาดที่เกิดขึ้นหลังจากเปิดตัว PHP ตัวอย่างเช่น หากมีข้อผิดพลาดทางไวยากรณ์ในไฟล์การกำหนดค่า ข้อมูลเกี่ยวกับข้อผิดพลาดนั้นจะปรากฏขึ้น พารามิเตอร์นี้สามารถมีค่า 0 หรือ 1 หรือเปิด / ปิด
  4. log_errors— คำสั่งนี้มีหน้าที่รับผิดชอบในการเขียนข้อความแสดงข้อผิดพลาดลงในไฟล์บันทึก พารามิเตอร์นี้สามารถมีค่า 0 หรือ 1 หรือเปิด / ปิด เหล่านั้น. บันทึกข้อผิดพลาดหรือไม่
  5. error_log— การตั้งค่านี้รับผิดชอบเส้นทางไปยังไฟล์ (ไฟล์บันทึก) ซึ่งข้อผิดพลาดของแอปพลิเคชันทั้งหมดที่เกิดขึ้นจะถูกบันทึก
  6. 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 และเวลาที่ระบุโดยใช้เบราว์เซอร์เฉพาะ

รายการสคริปต์สำหรับเขียนข้อมูลลงในไฟล์บันทึก

การติดตั้งสคริปต์

บันทึกสคริปต์ในเทมเพลตหรือในไฟล์ภายนอก 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 ไฟล์และใส่ไว้ในไฟล์เก็บถาวร
  • เหมือนกัน แต่มีพัสดุส่งถึงที่ทำการไปรษณีย์