การตรวจสอบข้อผิดพลาด (error) เวลาพัฒนาโปรแกรม หรือเมื่อรันโปรแกรม ถือว่ามีความสำคัญอย่างหนึ่ง เพื่อที่จะทำให้ระบบทำงานได้อย่างถูกต้อง
สำหรับการพัฒนา Web Application ด้วย PHP การตรวจสอบหรือแสดงผลข้อผิดพลาด สามารถทำได้ สองวิธีหลักๆ คือ
- แสดงข้อผิดพลาด (error) ผ่านหน้าเว็บ
- เก็บข้อผิดพลาดไว้ในไฟล์ (log file) เพื่อการตรวจสอบ
วิธีแรก การแสดงผลข้อผิดพลาด ผ่านหน้าเว็บเมื่อรันโปรแกรมเลย ถือว่ามีความสะดวกสบายมาก คือเมื่อโปรแกรมเมอร์พัฒนาโปรแกรมไป รันผ่านหน้าเว็บ ก็สามารถเห็นข้อผิดพลาดที่เกิดขึ้นได้เลย ว่าเกิดปัญหาที่ไหน ไฟล์อะไร บรรทัดเท่าไร
แต่จะมีข้อเสียอย่างมาก หากปล่อยให้มีการแสดงผลข้อผิดพลาดนี้ แก่ผู้ใช้งานทั่วไป เพราะอาจแสดงรายละเอียดโปรแกรมมากเกินไป ซึ่งอาจทำให้เปิดเผยช่องโหว่ของโปรแกรมได้
คำแนะนำคือ ในขณะที่กำลังพัฒนาโปรแกรม (development) หรือบนเครื่องเซิร์ฟเวอร์สำหรับทดสอบโปรแกรม เราอาจเปิดการแสดงผลข้อผิดพลาดผ่านหน้าเว็บเลย เพื่อสะดวกต่อโปรแกรมเมอร์ ในการตรวจสอบ
แต่เมื่อไรก็ตาม ระบบเริ่มใช้งานจริง (production) แนะนำให้ปิดการแสดงผลข้อผิดพลาดผ่านหน้าเว็บ ให้เก็บข้อผิดพลาดไว้ในแบบที่ 2 คือเก็บไว้ในไฟล์ (log file) แล้วดูข้อผิดพลาดจากในไฟล์
ตัวอย่างข้อผิดพลาดในการเขียน PHP เช่น พิมพ์เครื่องหมาย : แทนที่เป็น ;
$ cat /var/www/html/test.php <?php
print 'hello':
?>
แสดงข้อผิดพลาดผ่านหน้าเว็บ (display_errors)
PHP เวอร์ชั่นหลังๆ จะปิดการแสดงข้อผิดพลาดผ่านหน้าเว็บ หากต้องการเปิดคุณสมบัตินี้ทำได้สองวิธีคือ
1. แก้ไฟล์ /etc/php.ini จะมีผลทั้งเซิร์ฟเวอร์
ออปชั่นที่ต้องแก้ไขคือ “display_errors”
- “On” หากต้องการเปิดการแสดงผลข้อผิดพลาดผ่านหน้าเว็บ เหมาะสำหรับการพัฒนาโปรแกรม (development)
- “Off” หากไม่ต้องการแสดงผลข้อผิดพลาดผ่านหน้าเว็บ สำหรับระบบที่ใช้งานจริงแล้ว (production)
ตัวอย่างการคอนฟิกในไฟล์ /etc/php.ini
... display_errors = On ...
หลังจากแก้ไขไฟล์ ต้องรีโหลด Web Server เพื่อให้คอนฟิกใหม่มีผล
# service httpd reload Reloading httpd: [ OK ]
ตัวอย่างการแสดงผลข้อผิดพลาดผ่านหน้าเว็บ
2. หากไม่สามารถแก้ไขไฟล์ /etc/php.ini ได้ สามารถใช้ฟังก์ชั่น “ini_set” เพื่อเปิดคุณสมบัตินี้ได้
ตัวอย่างการใช้ฟังก์ชั่น “ini_set” เพื่อตั้งค่าคอนฟิก “display_errors”
<?php ini_set('display_errors', TRUE); ... ?>
เก็บข้อผิดพลาดไว้ในไฟล์ (error_log)
เมื่อระบบใช้งานจริง (production) แล้ว แนะนำให้ปิดการแสดงผลข้อผิดพลาดผ่านหน้าเว็บ แต่ให้เก็บไว้ในไฟล์ ไว้ดูย้อนหลังได้
ตัวอย่างคอนฟิกให้เก็บข้อผิดพลาดของการรัน PHP ไว้ในไฟล์ /var/log/httpd/php_errors.log
... html_errors = Off log_errors = On error_log = /var/log/httpd/php_errors.log ...
ต้องสร้างไฟล์สำหรับเก็บ และตั้งค่าเจ้าของไฟล์ (owner) เพื่อให้โปรเซสเว็บเซิร์ฟเวอร์ เช่น apache เขียนไฟล์ได้
# touch /var/log/httpd/php_errors.log # chown apache /var/log/httpd/php_errors.log
หลังจากแก้ไขไฟล์ ต้องรีโหลด Web Server เพื่อให้คอนฟิกใหม่มีผล
# service httpd reload Reloading httpd: [ OK ]
ตัวอย่างข้อผิดพลาดที่ถูกเก็บไว้ในไฟล์
# tail -f /var/log/httpd/php_errors.log [12-Feb-2010 12:49:25] PHP Parse error: syntax error, unexpected ':' in /var/www/html/test.php on line 3
หรือถ้าต้องการเก็บไว้ใน syslog ก็แก้คอนฟิก “error_log” ให้เป็น syslog ได้
... html_errors = Off log_errors = On error_log = syslog ...
ตัวอย่างการแสดงผลในไฟล์ /var/log/messages
# tail -f /var/log/messages Feb 12 15:05:08 web httpd: PHP Parse error: syntax error, unexpected ':' in /var/www/html/test.php on line 3