การดีบัก PHP: error_reporting และ ini_set
การเขียนโปรแกรม PHP ย่อมหนีไม่พ้นการเจอปัญหาและข้อผิดพลาด การดีบัก (Debugging) คือกระบวนการค้นหาและแก้ไขข้อผิดพลาดเหล่านั้นให้โปรแกรมทำงานได้อย่างถูกต้อง ในบทนี้ เราจะมาเรียนรู้วิธีการใช้ `error_reporting` และ `ini_set` ซึ่งเป็นเครื่องมือสำคัญในการดีบัก PHP ที่จะช่วยให้คุณเห็นข้อผิดพลาดที่เกิดขึ้นและจัดการกับการแสดงผลของข้อผิดพลาดเหล่านั้น
Error Reporting Level คืออะไร?
Error Reporting Level คือการกำหนดระดับของข้อผิดพลาดที่ PHP จะรายงานออกมา PHP มีหลายระดับของข้อผิดพลาด ตั้งแต่ข้อผิดพลาดเล็กน้อย (Notice) ไปจนถึงข้อผิดพลาดร้ายแรงที่ทำให้โปรแกรมหยุดทำงาน (Fatal Error) การกำหนด Error Reporting Level ที่เหมาะสมจะช่วยให้คุณเห็นข้อผิดพลาดที่สำคัญและไม่ถูกรบกวนด้วยข้อผิดพลาดที่ไม่สำคัญ
การตั้งค่า Error Reporting Level ด้วย error_reporting()
ฟังก์ชัน error_reporting() ใช้เพื่อตั้งค่า Error Reporting Level ใน PHP คุณสามารถกำหนดค่าได้หลายแบบ โดยแต่ละค่าจะมีความหมายดังนี้:
E_ALL: รายงานข้อผิดพลาดทุกประเภท (รวมถึง Strict standards ใน PHP 5)E_ERROR: รายงานข้อผิดพลาดร้ายแรงที่ทำให้สคริปต์หยุดทำงานE_WARNING: รายงานคำเตือน (Warning) ที่อาจทำให้สคริปต์ทำงานไม่ถูกต้องE_PARSE: รายงานข้อผิดพลาดในการ Parse (เช่น Syntax Error)E_NOTICE: รายงานข้อผิดพลาดเล็กน้อย (Notice) ที่อาจเกิดจากตัวแปรที่ไม่ได้กำหนดค่าE_CORE_ERROR: รายงานข้อผิดพลาดที่เกิดขึ้นใน PHP CoreE_CORE_WARNING: รายงานคำเตือนที่เกิดขึ้นใน PHP CoreE_COMPILE_ERROR: รายงานข้อผิดพลาดที่เกิดขึ้นระหว่างการ CompileE_COMPILE_WARNING: รายงานคำเตือนที่เกิดขึ้นระหว่างการ CompileE_USER_ERROR: รายงานข้อผิดพลาดที่ผู้ใช้กำหนดขึ้น (User-generated Error)E_USER_WARNING: รายงานคำเตือนที่ผู้ใช้กำหนดขึ้น (User-generated Warning)E_USER_NOTICE: รายงานข้อผิดพลาดเล็กน้อยที่ผู้ใช้กำหนดขึ้น (User-generated Notice)E_STRICT: แนะนำการเขียนโค้ดที่ทันสมัย (เฉพาะใน PHP 5)E_RECOVERABLE_ERROR: รายงานข้อผิดพลาดที่สามารถกู้คืนได้E_DEPRECATED: รายงานการใช้ฟังก์ชันหรือคุณสมบัติที่เลิกใช้งานแล้วE_USER_DEPRECATED: รายงานการใช้ฟังก์ชันหรือคุณสมบัติที่ผู้ใช้กำหนดขึ้นที่เลิกใช้งานแล้ว
คุณสามารถรวมค่าเหล่านี้เข้าด้วยกันได้โดยใช้ตัวดำเนินการ | (OR) เช่น:
<?php
// รายงานทุกอย่างยกเว้น Notices และ Strict standards
error_reporting(E_ALL & ~E_NOTICE & ~E_STRICT);
// รายงานเฉพาะ Errors และ Warnings
error_reporting(E_ERROR | E_WARNING);
?>
กรณีใช้งานจริง:
ในระหว่างการพัฒนา (Development) ควรตั้งค่า error_reporting(E_ALL); เพื่อให้เห็นข้อผิดพลาดทุกประเภท ใน Production Environment ควรตั้งค่าให้รายงานเฉพาะ Errors และ Warnings เพื่อป้องกันไม่ให้ข้อมูลที่เป็นประโยชน์ต่อผู้ไม่หวังดีรั่วไหลออกมา เช่น:
<?php
// Development Environment
error_reporting(E_ALL);
ini_set('display_errors', 1); // แสดง error message
// Production Environment
error_reporting(E_ERROR | E_WARNING | E_PARSE);
ini_set('display_errors', 0); // ไม่แสดง error message
ini_set('log_errors', 1); // บันทึก error message ลงใน log file
ini_set('error_log', '/path/to/error.log'); // กำหนด path ของ error log file
?>
การแสดง Error Message ด้วย ini_set('display_errors', 1);
ini_set() เป็นฟังก์ชันที่ใช้ในการตั้งค่า PHP Configuration Options ใน Runtime หนึ่งใน Option ที่สำคัญคือ display_errors ซึ่งใช้ควบคุมว่าจะให้ PHP แสดง Error Message ออกมาหรือไม่
ini_set('display_errors', 1);: เปิดการแสดง Error Messageini_set('display_errors', 0);: ปิดการแสดง Error Message
ข้อควรระวัง: ไม่ควรเปิดการแสดง Error Message ใน Production Environment เพราะอาจทำให้ข้อมูลที่เป็นประโยชน์ต่อผู้ไม่หวังดีรั่วไหลออกมา ควรบันทึก Error Message ลงใน Log File แทน
การตั้งค่า PHP Configuration ด้วย ini_set()
นอกจาก display_errors แล้ว ini_set() ยังสามารถใช้ตั้งค่า PHP Configuration Options อื่นๆ ได้อีกมากมาย ตัวอย่างเช่น:
ini_set('memory_limit', '128M');: กำหนด Memory Limit ให้กับสคริปต์ini_set('max_execution_time', 30);: กำหนด Maximum Execution Time ให้กับสคริปต์ini_set('date.timezone', 'Asia/Bangkok');: กำหนด Timezone
กรณีใช้งานจริง:
หากสคริปต์ของคุณใช้ Memory มากเกินไป คุณสามารถเพิ่ม Memory Limit ได้ด้วย ini_set('memory_limit', '256M'); หรือหากสคริปต์ใช้เวลานานในการทำงาน คุณสามารถเพิ่ม Maximum Execution Time ได้ด้วย ini_set('max_execution_time', 60);
ข้อผิดพลาดที่พบบ่อยและวิธีแก้ไข
- ลืมตั้งค่า Error Reporting Level: หากคุณไม่ได้ตั้งค่า Error Reporting Level PHP จะใช้ Default Value ซึ่งอาจไม่รายงานข้อผิดพลาดที่คุณต้องการเห็น แก้ไขโดยการใช้
error_reporting()เพื่อกำหนด Error Reporting Level ที่เหมาะสม - เปิดการแสดง Error Message ใน Production Environment: การเปิดการแสดง Error Message ใน Production Environment อาจทำให้ข้อมูลที่เป็นประโยชน์ต่อผู้ไม่หวังดีรั่วไหลออกมา แก้ไขโดยการปิดการแสดง Error Message ด้วย
ini_set('display_errors', 0);และบันทึก Error Message ลงใน Log File แทน - ไม่ได้กำหนด Timezone: หากคุณไม่ได้กำหนด Timezone PHP อาจใช้ Default Timezone ซึ่งอาจไม่ถูกต้อง แก้ไขโดยการกำหนด Timezone ด้วย
ini_set('date.timezone', 'Asia/Bangkok'); - Memory Limit เกิน: หากสคริปต์ของคุณใช้ Memory มากเกินไป PHP จะแสดง Error Message แก้ไขโดยการเพิ่ม Memory Limit ด้วย
ini_set('memory_limit', '256M');หรือ Optimize Code เพื่อลดการใช้ Memory - Maximum Execution Time เกิน: หากสคริปต์ของคุณใช้เวลานานในการทำงาน PHP จะหยุดการทำงานและแสดง Error Message แก้ไขโดยการเพิ่ม Maximum Execution Time ด้วย
ini_set('max_execution_time', 60);หรือ Optimize Code เพื่อลดเวลาในการทำงาน
สรุป
การดีบัก PHP เป็นทักษะที่สำคัญสำหรับนักพัฒนาทุกคน การใช้ error_reporting และ ini_set จะช่วยให้คุณเห็นข้อผิดพลาดที่เกิดขึ้นและจัดการกับการแสดงผลของข้อผิดพลาดเหล่านั้นได้อย่างมีประสิทธิภาพ อย่าลืมตั้งค่า Error Reporting Level ที่เหมาะสมและปิดการแสดง Error Message ใน Production Environment เพื่อความปลอดภัยของ Application ของคุณ
ในบทถัดไป เราจะไปเรียนรู้เกี่ยวกับการใช้ Composer ซึ่งเป็นเครื่องมือจัดการ Dependency ที่จะช่วยให้การพัฒนา PHP Application ของคุณง่ายและมีประสิทธิภาพมากยิ่งขึ้น