อ่านและแก้ปัญหาจาก PHP Error Log

ทำความเข้าใจ PHP Error ทุกประเภท อ่าน Stack Trace ให้เป็น และแก้ปัญหาเว็บล่มได้ด้วยตัวเองโดยไม่ต้องเดา

อ่าน PHP Error Log แก้ปัญหาเว็บ

PHP Error Types ที่ต้องรู้จัก

PHP มีระดับ Error ที่แตกต่างกัน การเข้าใจแต่ละระดับช่วยให้ประเมินความร้ายแรงและลำดับการแก้ไขได้ถูกต้อง:

Notice ข้อมูลเสริม — เช่นใช้ตัวแปรที่ยังไม่ได้ Define หรือ Array Key ที่ไม่มี สคริปต์ยังทำงานต่อได้แต่อาจให้ผลไม่ถูกต้อง

Warning คำเตือน — เช่น include ไฟล์ที่ไม่มี หรือใช้ Argument ผิดประเภท สคริปต์ยังทำงานต่อได้ แต่ฟังก์ชันนั้นอาจไม่ทำงาน

Fatal Error ร้ายแรง — หยุดทำงานทันที — เช่นเรียก Function ที่ไม่มีอยู่ หรือ Memory หมด สคริปต์หยุดทำงานและแสดง Blank Page

Parse Error ข้อผิดพลาด Syntax — เช่นลืม Semicolon หรือปิด Bracket ไม่ครบ PHP ไม่สามารถรัน Script ได้เลย

ระดับอื่นที่พบ:

เปิด Error Log ใน cPanel

ใน Shared Hosting ทั่วไป PHP Error จะถูกบันทึกลงในไฟล์ Error Log โดยอัตโนมัติ ดูได้ที่:

  1. ล็อกอิน cPanel ไปที่หัวข้อ Metrics
  2. คลิก Errors เพื่อดู 300 บรรทัดล่าสุดของ Error Log
  3. สำหรับ Log ทั้งหมด ไปที่ Files → File Manager แล้วหาไฟล์ error_log ในโดเมนของคุณ

ดู Error Log ผ่าน File Manager

ไฟล์ error_log มักอยู่ที่ Root ของ public_html หรือในโฟลเดอร์ที่เกิด Error ขึ้น:

ดู Error Log ผ่าน SSH

ถ้าเข้าถึง SSH ได้ ใช้คำสั่งเหล่านี้เพื่อ Monitor Error แบบ Real-time:

# ดู Error ล่าสุด 50 บรรทัด
tail -50 /home/username/public_html/error_log

# Monitor Error แบบ Real-time
tail -f /home/username/public_html/error_log

# หา Fatal Error ทั้งหมด
grep -i "fatal" /home/username/public_html/error_log

# ดู Error ของวันนี้
grep "$(date '+%d-%b-%Y')" error_log | tail -30

เปิด WP_DEBUG สำหรับ WordPress

WordPress มีระบบ Debug Mode ของตัวเอง เปิดใน wp-config.php:

// เปิด Debug Mode (เฉพาะ Development)
define('WP_DEBUG', true);

// บันทึก Error ลงไฟล์แทนแสดงบนหน้าเว็บ
define('WP_DEBUG_LOG', true);

// ไม่แสดง Error บนหน้าเว็บ (Production)
define('WP_DEBUG_DISPLAY', false);

// เปิด Query Log
define('SAVEQUERIES', true);

Error Log ของ WordPress จะถูกบันทึกที่ /wp-content/debug.log

Tip: ห้ามเปิด WP_DEBUG_DISPLAY true บน Production เพราะจะแสดง Error รวมทั้ง Path และ Code ให้ผู้เยี่ยมชมเห็น ซึ่งเป็นความเสี่ยงด้านความปลอดภัย

อ่าน Stack Trace

เมื่อเกิด Fatal Error มักมี Stack Trace แสดงเส้นทางการเรียก Function ที่ทำให้เกิด Error ตัวอย่าง:

PHP Fatal error:  Uncaught Error: Call to undefined function my_custom_func()
  in /home/user/public_html/wp-content/themes/mytheme/functions.php:245
Stack trace:
#0 /home/user/public_html/wp-includes/class-wp-hook.php(312): mytheme_setup()
#1 /home/user/public_html/wp-includes/class-wp-hook.php(334): WP_Hook->apply_filters()
#2 /home/user/public_html/wp-settings.php(422): WP_Hook->do_action()
thrown in /home/user/public_html/wp-content/themes/mytheme/functions.php on line 245

อ่านจาก บรรทัดบนสุด (จุดเกิดเหตุ) และดูไฟล์+บรรทัดที่ระบุ ในตัวอย่างนี้ functions.php บรรทัด 245 เรียก Function ที่ไม่มีอยู่

แก้ Error ที่พบบ่อย

# 1. Undefined variable — ตรวจสอบว่า Define ตัวแปรก่อน
# ผิด: echo $name;
# ถูก: $name = ''; echo $name;

# 2. Undefined index — ตรวจก่อน Access Array Key
# ผิด: echo $arr['key'];
# ถูก: echo isset($arr['key']) ? $arr['key'] : '';
# หรือ PHP 8: echo $arr['key'] ?? '';

# 3. Syntax Error — ตรวจหา missing semicolon/bracket
php -l yourfile.php

# 4. Memory Exceeded — เพิ่ม Memory ใน .htaccess
php_value memory_limit 256M

ตรวจสอบว่า PHP Error Log ทำงานถูกต้อง

# ตรวจว่า error_log ถูกตั้งค่าให้บันทึกไฟล์
php -r "echo ini_get('error_log');"

# สร้าง Error ทดสอบแล้วดูว่าบันทึกไหม
php -r "trigger_error('Test Error', E_USER_WARNING);"

# ดู Error Log แบบ Real-time
tail -f error_log

# นับจำนวน Fatal Error วันนี้
grep -c "Fatal error" error_log
Tip: ติดตั้ง Plugin "Query Monitor" บน WordPress เพื่อดู PHP Error, Database Query ช้า และ Hook ทั้งหมดบน Admin Bar แบบ Real-time ในระหว่าง Development

แก้ปัญหาที่พบบ่อย

Error: "Undefined function xxx" หรือ "Class not found"

Function หรือ Class ที่เรียกไม่ได้ถูก Include/Load มาก่อน สำหรับ WordPress มักเกิดจาก Plugin ถูก Deactivate หรือโหลดก่อน Theme Functions หน้าที่ตรวจสอบคือตรวจว่า Plugin/Library ที่ Function นั้นอยู่ ยังเปิดอยู่และถูกโหลดก่อนบรรทัดที่เรียกใช้

Error: "Parse error: syntax error, unexpected token"

PHP Syntax ผิด มักเกิดจากลืม Semicolon (;) ปิด Bracket ไม่ครบ หรือใช้ Feature ที่มีแค่ PHP Version ใหม่กว่า ตรวจสอบด้วย php -l filename.php เพื่อหาบรรทัดที่ผิด

Error: "Allowed memory size exhausted"

PHP ใช้ Memory เกิน Limit ที่ตั้งไว้ แก้ระยะสั้นโดยเพิ่ม php_value memory_limit 256M ใน .htaccess แก้ระยะยาวโดยหา Code ที่ใช้ Memory มากเกินจำเป็น เช่น Query ที่ดึงข้อมูลทั้งหมดในคราวเดียว

Error: "Maximum execution time exceeded"

Script ทำงานนานเกิน max_execution_time (default 30 วินาที) เพิ่ม Timeout ด้วย php_value max_execution_time 120 แต่ควรหาสาเหตุที่ Script ช้าด้วย เช่น Database Query ที่ไม่มี Index หรือ External API Call ที่ Timeout


คำถามที่พบบ่อย

PHP Notice และ Warning ควรแก้ไหม ทั้งที่เว็บยังใช้ได้?

ควรแก้เสมอ เพราะ Notice/Warning แสดงว่า Code ทำงานในลักษณะที่อาจไม่ได้ตั้งใจ นอกจากนี้การแสดง Error มากๆ ใน Log ทำให้หา Fatal Error จริงๆ ยากขึ้น และใน PHP Version ใหม่ Warning บางอย่างอาจกลายเป็น Fatal Error

ดู Error Log แล้วเห็น IP หรือ Path ของ Hacker ทำอะไรได้บ้าง?

ดู IP ที่เรียก Script ผิดปกติแล้ว Block ผ่าน .htaccess หรือ cPanel IP Deny ตรวจสอบว่าไฟล์ที่ถูก Request มีจริงหรือไม่ และลบหรือป้องกันไฟล์ที่ไม่ต้องการให้เข้าถึง

ทำอย่างไรให้ Error Log ไม่ใหญ่มากเกินไป?

ตั้ง Log Rotation หรือลบ error_log เป็นระยะ บน cPanel สามารถใช้ Cron Job รัน echo > /home/user/public_html/error_log ทุกสัปดาห์ หรือตั้ง log_errors_max_len เพื่อจำกัดความยาว Error แต่ละบรรทัด