PHP
max_execution_time คืออะไร?
max_execution_time คือค่า (parameter) ใน PHP ที่บอกว่า "สคริปต์ PHP ใช้เวลาประมวลผลได้ยาวที่สุดเท่าไหร่ (วินาที) ก่อนเกิด Timeout" เมื่อสคริปต์ใช้เวลานานกว่าค่านี้ Web Server จะยกเลิก (Kill) สคริปต์นั้นโดยอัตโนมัติ ทำให้เว็บแสดง "Error 500 - Maximum Execution Time Exceeded"
ค่าเริ่มต้นปกติคือ 30 วินาที ส่วนใหญ่เพียงพอ แต่บางสคริปต์ (เช่น การ Backup Database, Bulk Export/Import) ต้องใช้เวลานานกว่า 30 วินาที
สาเหตุที่สคริปต์ใช้เวลานาน
สาเหตุทั่วไป:
- Slow Database Query — สคริปต์ต้องรอ Database Response ยาวนาน
- Large File Processing — การ Upload/Download/Edit ไฟล์ขนาดใหญ่ (เช่น CSV หลายพัน Row)
- Loop ขนาดใหญ่ — วนลูปประมวลผลข้อมูลเป็นล้าน Row
- External API Call — เรียก API ของบริการภายนอก ที่ Response ช้า
- Image Processing — Resize/Compress รูปขนาดใหญ่หลาย ๆ ตัว
- Backup/Restore — WordPress Backup Plugin, Database Restore
วิธีแก้ 1: เพิ่ม max_execution_time ใน cPanel
ขั้นตอน:
- Login เข้า cPanel https://yourdomain.com:2083
- หาส่วน Software > Select PHP Version หรือ MultiPHP Manager
- เลือก Domain ของคุณ
- คลิก Switch to PHP Options (เพื่อแสดงตัวเลือกการตั้งค่า)
- ค้นหา max_execution_time และเปลี่ยนค่า:
- ค่าเริ่มต้น: 30 วินาที
- สำหรับการ Backup/Large File: 300 วินาที (5 นาที)
- สำหรับการทำงาน Background: 600 วินาที (10 นาที)
- ห้ามตั้งเกิน 900 วินาที (15 นาที) เพราะ Web Server ตัวเอง (Apache/Nginx) อาจ Timeout ก่อนก็ได้
- คลิก Apply หรือ Save
วิธีแก้ 2: เพิ่ม max_execution_time ใน .htaccess
ถ้า cPanel ไม่มีตัวเลือก PHP Version Management ให้ใช้วิธีนี้:
- เชื่อมต่อ Hosting ผ่าน FTP หรือ File Manager ใน cPanel
- ไปยัง public_html (root folder ของเว็บ)
- หาไฟล์ .htaccess ถ้ามีอยู่ให้ Edit ถ้าไม่มีให้สร้างไฟล์ใหม่ชื่อ .htaccess
- เพิ่มบรรทัดต่อไปนี้:
php_value max_execution_time 300
ตัวเลือกอื่น ๆ ที่เกี่ยวข้องที่ควรเพิ่มใน .htaccess เดียวกันนี้:
php_value max_execution_time 300
php_value max_input_time 300
php_value memory_limit 256M
php_value upload_max_filesize 100M
php_value post_max_size 100M
ความหมาย:
- max_execution_time — สคริปต์ PHP ใช้เวลาสูงสุด 300 วินาที
- max_input_time — ข้อมูล Input (POST/GET) ใช้เวลาสูงสุด 300 วินาที
- memory_limit — สคริปต์ใช้ RAM ได้สูงสุด 256MB (เพิ่มขึ้นจากเริ่มต้น 128MB)
- upload_max_filesize — สามารถ Upload ไฟล์ได้สูงสุด 100MB
- post_max_size — ข้อมูล POST ได้สูงสุด 100MB
วิธีแก้ 3: เพิ่ม max_execution_time ใน php.ini (สำหรับ VPS หรือ Dedicated)
วิธีนี้ใช้ได้สำหรับ VPS หรือ Dedicated Server เท่านั้น (Shared Hosting ปกติจะไม่มี php.ini ให้แก้)
# 1. เชื่อมต่อ SSH (VPS หรือ Dedicated เท่านั้น)
ssh user@your-server-ip
# 2. หา php.ini
locate php.ini
# หรือดู Apache Configuration
grep -r "php.ini" /etc/apache2/
# 3. Edit php.ini (ต้อง root)
sudo nano /etc/php/8.0/apache2/php.ini
# ค้นหา "max_execution_time" ตั้งค่า:
max_execution_time = 300
# 4. Save (Ctrl+O, Enter, Ctrl+X)
# 5. Restart Apache
sudo systemctl restart apache2
วิธีแก้ 4: ตั้งค่า max_execution_time ใน PHP Code (WordPress Plugin)
ในบางสถานการณ์ สามารถตั้งค่า max_execution_time โดยตรงใน PHP Code ได้:
// สำหรับ WordPress Plugin หรือ PHP Script ที่ต้องใช้เวลานาน
set_time_limit(300); // ตั้ง max_execution_time เป็น 300 วินาที
// หรือสำหรับ WordPress:
// ใส่บรรทัดนี้ใน wp-config.php ก่อน "That's all, stop editing!":
define('WP_MEMORY_LIMIT', '256M');
define('WP_MAX_MEMORY_LIMIT', '512M');
ข้อควรระวัง: ไม่ใช่ทุก Hosting ที่อนุญาต set_time_limit() ใน PHP Code ด้วยเหตุผลด้านความปลอดภัย
ตรวจสอบว่า max_execution_time เปลี่ยนไปแล้ว
หลังจากเปลี่ยนค่า ให้ตรวจสอบด้วยขั้นตอนต่อไปนี้:
// 1. สร้างไฟล์ PHP ชื่อ phpinfo.php ใน public_html
// เพิ่มบรรทัด:
// 2. เข้าเว็บ https://yourdomain.com/phpinfo.php ผ่านเบราว์เซอร์
// ค้นหา "max_execution_time" บนหน้า
// 3. ตรวจสอบคอลัมน์ "Local Value" ว่าเป็นค่าใหม่หรือยัง
// 4. สำหรับ WordPress ลองใส่บรรทัดใน wp-config.php:
echo 'max_execution_time: ' . ini_get('max_execution_time') . ' seconds';
แก้ปัญหาที่พบบ่อย
Error: "Maximum Execution Time Exceeded" ยังเกิดขึ้นแม้เพิ่ม max_execution_time แล้ว
อาจเกิดจาก:
- Timeout เกิดจาก Web Server (Apache/Nginx) ไม่ใช่ PHP (Web Server มี Timeout ของตัวเอง)
- สคริปต์ยังใช้เวลานานกว่าค่าใหม่ที่ตั้ง
- ไม่ได้ Restart Web Server หลังแก้ .htaccess
วิธีแก้: ตรวจสอบ Apache Configuration ว่า TimeOut เท่าไหร่ (ปกติ 300 วินาที) ถ้า max_execution_time > TimeOut ของ Apache ให้เพิ่ม TimeOut ใน Apache Config ด้วย หรือลองรัน Backup/Task นั้นโดยใช้ Background Task (Cron Job) แทนการรัน HTTP Request ตรง ๆ
Error: "ไม่สามารถ Edit .htaccess ได้"
อาจเกิดจาก:
- .htaccess ไม่มีสิทธิ์ Write
- Hosting ปิดการใช้ php_value ใน .htaccess
- ไฟล์ .htaccess ถูกคุ้มครอง
วิธีแก้: ลองใช้ cPanel PHP Options แทน หรือติดต่อ Hosting Provider ขอให้เปิดใช้ php_value ใน .htaccess
Error: "WordPress Database Backup Plugin ยังคงหมดเวลา"
Backup Plugin ส่วนใหญ่ต้องใช้เวลานาน เพราะต้อง Dump Database ทั้งหมดแล้ว Compress
วิธีแก้: ลองใช้ Backup Plugin ที่รองรับการทำงานใน Background (เช่น BackWPup ที่ใช้ Cron Schedule) แทนการรัน Backup ผ่าน HTTP Request ตรง หรือลองเพิ่ม max_execution_time เป็น 600 วินาที (10 นาที) ลองดำเนินการ Backup ใหม่
Error: "php_value ใน .htaccess ไม่มีผล"
อาจเกิดจาก:
- .htaccess ไม่อยู่ใน Root Folder ของเว็บ (ต้องอยู่ใน public_html ไม่ใช่ subfolder)
- AllowOverride ของ Apache ถูกปิด
- PHP ถูกรัน FastCGI/PHP-FPM แทน Apache Module (ต้องใช้ .user.ini แทน)
วิธีแก้: ตรวจสอบว่า .htaccess อยู่ไฟล์ที่ถูกต้อง (public_html) แล้ว Restart Web Server ลองใช้ cPanel PHP Options แทน หรือติดต่อ Hosting Provider
Error: "การเพิ่ม max_execution_time ทำให้เว็บ Crash"
อาจเกิดจากการตั้งค่า php_value ที่ Syntax ผิด หรือเซิร์ฟเวอร์โหลด php_value ผิดประการ
วิธีแก้: ลบบรรทัด php_value ที่เพิ่มออกจาก .htaccess ไปชั่วคราว แล้ว Restart Web Server ถ้าเว็บกลับมาใช้ได้ หมายถึง Syntax ผิด ให้ตรวจสอบการเขียน php_value ใหม่
คำถามที่พบบ่อย
Q: ตั้ง max_execution_time เป็นเท่าไร ดี?
A: ขึ้นอยู่กับชนิดของงาน ปกติ 30-60 วินาที พอ สำหรับ Backup/Export Database ให้ตั้ง 300 วินาที (5 นาที) สำหรับการประมวลผลขนาดใหญ่ ให้ตั้ง 600 วินาที (10 นาที) แต่ไม่ควรเกิน 900 วินาที (15 นาที) เพราะ Web Server จะ Timeout อยู่ดี
Q: max_execution_time และ max_input_time ต่างกันหรือ?
A: max_execution_time นับเวลาการประมวลผลสคริปต์ทั้งหมด ส่วน max_input_time นับเฉพาะเวลารอ Input Data (POST/GET) ถ้าสคริปต์ต้องรอข้อมูลนาน ต้องเพิ่มทั้งสองค่า
Q: ตั้ง max_execution_time = 0 (ไม่มีจำกัด) ได้หรือ?
A: ไม่ควร ตั้ง 0 หมายถึง PHP ไม่มีข้อจำกัดเวลา ถ้าสคริปต์ติดตัว (Infinite Loop) มันจะทำงานไม่สิ้นสุดและกินทรัพยากร Server ไปเปล่า ๆ ควรตั้งค่าที่สมเหตุสมผล เช่น 300 หรือ 600 วินาที