Skip to main content

เนื้อหาภาษาไทย / Thai content

System guide Content reviewed

การดีบัก PHP: error_reporting และ ini_set

บทความนี้กล่าวถึงการดีบัก PHP โดยเน้นการใช้ `error_reporting` เพื่อกำหนดระดับข้อผิดพลาดที่จะรายงาน และ `ini_set` เพื่อจัดการการแสดงผลข้อผิดพลาดและตั้งค่า PHP Co...

การดีบัก 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 Core
  • E_CORE_WARNING: รายงานคำเตือนที่เกิดขึ้นใน PHP Core
  • E_COMPILE_ERROR: รายงานข้อผิดพลาดที่เกิดขึ้นระหว่างการ Compile
  • E_COMPILE_WARNING: รายงานคำเตือนที่เกิดขึ้นระหว่างการ Compile
  • E_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 Message
  • ini_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);

ข้อผิดพลาดที่พบบ่อยและวิธีแก้ไข

  1. ลืมตั้งค่า Error Reporting Level: หากคุณไม่ได้ตั้งค่า Error Reporting Level PHP จะใช้ Default Value ซึ่งอาจไม่รายงานข้อผิดพลาดที่คุณต้องการเห็น แก้ไขโดยการใช้ error_reporting() เพื่อกำหนด Error Reporting Level ที่เหมาะสม
  2. เปิดการแสดง Error Message ใน Production Environment: การเปิดการแสดง Error Message ใน Production Environment อาจทำให้ข้อมูลที่เป็นประโยชน์ต่อผู้ไม่หวังดีรั่วไหลออกมา แก้ไขโดยการปิดการแสดง Error Message ด้วย ini_set('display_errors', 0); และบันทึก Error Message ลงใน Log File แทน
  3. ไม่ได้กำหนด Timezone: หากคุณไม่ได้กำหนด Timezone PHP อาจใช้ Default Timezone ซึ่งอาจไม่ถูกต้อง แก้ไขโดยการกำหนด Timezone ด้วย ini_set('date.timezone', 'Asia/Bangkok');
  4. Memory Limit เกิน: หากสคริปต์ของคุณใช้ Memory มากเกินไป PHP จะแสดง Error Message แก้ไขโดยการเพิ่ม Memory Limit ด้วย ini_set('memory_limit', '256M'); หรือ Optimize Code เพื่อลดการใช้ Memory
  5. 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 ของคุณง่ายและมีประสิทธิภาพมากยิ่งขึ้น

Office.in.th Custom Service

Want to build or adapt a system from this structure?

Office.in.th designs and develops enterprise web applications, API integrations, and public- and private-sector management systems, with long-term support.

See our software development service