📋 สารบัญ
Cron Job คืออะไร ทำไมถึงสำคัญ
Cron Job คือระบบ task scheduler บน Linux ที่ช่วยให้คุณสั่งให้โปรแกรมหรือ script รันอัตโนมัติตามเวลาที่กำหนดไว้ล่วงหน้า คำว่า "Cron" มาจาก Chronos (เทพแห่งเวลาของกรีก) และ "crontab" คือไฟล์ที่เก็บรายการงานเหล่านี้
ในบริบทของ Web Hosting งาน Cron Job มีประโยชน์มหาศาล ไม่ว่าจะเป็นการ backup ฐานข้อมูลอัตโนมัติทุกคืน การส่งอีเมลรายงานทุกสัปดาห์ หรือการลบไฟล์ temp ที่เก่าเพื่อประหยัดพื้นที่
- Backup ฐานข้อมูล MySQL ทุกคืนเวลา 02:00 น.
- ส่งอีเมล newsletter ทุกวันจันทร์เวลา 09:00 น.
- ลบไฟล์ session/tmp ที่เก่ากว่า 7 วัน
- ดึงข้อมูลจาก API ภายนอกทุก 30 นาที
- รีเจน sitemap.xml ทุก 6 ชั่วโมง
บน AsiaGB Hosting ที่ใช้ DirectAdmin เป็น control panel คุณสามารถตั้งค่า Cron Job ได้ผ่านหน้า GUI ได้เลยโดยไม่ต้องเข้า SSH หรือแก้ crontab ด้วยตนเอง
ทำความเข้าใจ Cron Syntax
Cron syntax ประกอบด้วย 5 ตำแหน่ง ตามด้วยคำสั่งที่ต้องการรัน แต่ละตำแหน่งแทนหน่วยเวลาที่แตกต่างกัน:
* * * * * /คำสั่ง/ที่/ต้องการรัน
│ │ │ │ │
│ │ │ │ └── วันในสัปดาห์ (0-7) (0 และ 7 = อาทิตย์)
│ │ │ └──── เดือน (1-12)
│ │ └────── วันในเดือน (1-31)
│ └──────── ชั่วโมง (0-23)
└────────── นาที (0-59)
ตัวอักษรพิเศษใน Cron
*= ทุกค่า (every)*/n= ทุก n หน่วย เช่น*/5= ทุก 5 นาทีn,m= หลายค่า เช่น1,15= วันที่ 1 และ 15n-m= ช่วง เช่น9-17= ชั่วโมง 9 ถึง 17
วิธีตั้งค่า Cron Job ใน DirectAdmin
การตั้งค่า Cron Job บน DirectAdmin ทำได้ง่ายมาก ทำตามขั้นตอนนี้:
- Login เข้า DirectAdmin Panel ที่
yourdomain.com:2222 - ไปที่เมนู Advanced Features
- คลิก Cron Jobs
- กรอกค่าในช่อง Minute, Hour, Day, Month, Weekday
- กรอกคำสั่งในช่อง Command
- คลิก Add เพื่อบันทึก
>/dev/null 2>&1 ต่อท้ายคำสั่ง
รัน PHP Script ผ่าน Cron Job
การรัน PHP script ผ่าน Cron มีวิธีหลักสองแบบ ได้แก่ PHP CLI และ curl/wget:
วิธีที่ 1: PHP CLI (แนะนำ)
/usr/local/bin/php /home/USERNAME/public_html/cron/backup.php
แทน USERNAME ด้วยชื่อ DirectAdmin account ของคุณ และปรับ path ของ script ให้ถูกต้อง
วิธีที่ 2: Curl เรียก URL
curl -s https://yourdomain.com/cron/backup.php > /dev/null 2>&1
วิธีนี้ง่ายแต่ต้องระวังเรื่อง security เพราะ URL เปิดเป็น public เข้าได้ได้
ตรวจสอบ PHP path บน DirectAdmin
หาก path PHP ไม่แน่ใจ ให้สร้างไฟล์ phpinfo.php และเช็ค แต่โดยทั่วไปบน DirectAdmin จะอยู่ที่:
- PHP 8.x:
/usr/local/bin/php - PHP 7.4:
/usr/local/bin/php74
Use Case ที่ใช้บ่อยบน Hosting
1. Backup ฐานข้อมูล MySQL ทุกคืน
0 2 * * * /usr/local/bin/php /home/USERNAME/public_html/backup-db.php
รันทุกวันเวลา 02:00 น. — เหมาะสำหรับ Hosting ที่ traffic น้อยตอนดึก
2. ส่งอีเมลรายสัปดาห์
0 9 * * 1 /usr/local/bin/php /home/USERNAME/public_html/send-newsletter.php
รันทุกวันจันทร์เวลา 09:00 น.
3. ลบไฟล์ cache เก่า
0 */6 * * * /usr/bin/find /home/USERNAME/public_html/cache/ -mtime +7 -delete
รันทุก 6 ชั่วโมง ลบไฟล์ที่เก่ากว่า 7 วัน
4. WordPress WP-Cron
*/15 * * * * /usr/local/bin/php /home/USERNAME/public_html/wp-cron.php > /dev/null 2>&1
รัน WP-Cron ทุก 15 นาที แนะนำให้ปิด WP-Cron อัตโนมัติของ WordPress แล้วใช้วิธีนี้แทนเพื่อประสิทธิภาพที่ดีกว่า
5. รีเจน Sitemap
0 */6 * * * /usr/local/bin/php /home/USERNAME/public_html/sitemap-generate.php
รีเจน sitemap ทุก 6 ชั่วโมง เพื่อให้ Google Crawl ได้ข้อมูลล่าสุด
ตาราง Cron Syntax พร้อมตัวอย่าง
| Cron Expression | ความหมาย | Use Case |
|---|---|---|
* * * * * | ทุก 1 นาที | Monitoring / health check |
*/5 * * * * | ทุก 5 นาที | ดึงข้อมูล API |
*/15 * * * * | ทุก 15 นาที | WP-Cron |
0 * * * * | ทุกชั่วโมง (นาที 0) | Cache clear |
0 */6 * * * | ทุก 6 ชั่วโมง | Sitemap regen |
0 2 * * * | ทุกวัน เวลา 02:00 | Backup รายวัน |
0 9 * * 1 | ทุกวันจันทร์ 09:00 | Weekly report |
0 0 1 * * | วันที่ 1 ของทุกเดือน | Monthly summary |
0 0 1,15 * * | วันที่ 1 และ 15 ทุกเดือน | Backup 2 ครั้ง/เดือน |
0 8-17 * * 1-5 | ทุกชั่วโมง วันทำงาน 08-17 | Business hour task |
แก้ปัญหา Cron ไม่ทำงาน
หาก Cron Job ที่ตั้งไว้ไม่ทำงานตามที่คาด ให้ตรวจสอบตามลำดับนี้:
1. ตรวจสอบ Path ที่ถูกต้อง
Cron ทำงานใน environment ที่จำกัดกว่า shell ปกติ ตัวแปร $PATH จะไม่ถูกตั้งค่าเหมือนตอน login ดังนั้นให้ระบุ full path เสมอ:
# ❌ อาจไม่ทำงาน
php /home/user/backup.php
# ✅ ถูกต้อง
/usr/local/bin/php /home/user/public_html/backup.php
2. ตรวจสอบ Permission
chmod 755 /home/USERNAME/public_html/cron/backup.php
script ต้องมีสิทธิ์ execute สำหรับเจ้าของไฟล์
3. ดู Email Log จาก Cron
โดย default Cron จะส่ง email ไปยัง email ที่ตั้งใน DirectAdmin เมื่อมี output จาก script ให้ตรวจสอบ inbox เพื่อดู error message
4. ทดสอบ Script ใน SSH ก่อน
/usr/local/bin/php /home/USERNAME/public_html/cron/backup.php
รันตรงใน SSH terminal เพื่อดูว่า script ทำงานได้หรือเปล่า ถ้า error ให้แก้ script ก่อน
5. ตรวจสอบเวลา Server
Best Practices และข้อควรระวัง
อย่ารัน Cron บ่อยเกินไป
Cron ที่รันทุก 1 นาทีและทำงานนาน 5 นาที จะทำให้มีหลาย instance รันพร้อมกัน ซึ่งกินทรัพยากร Hosting และอาจทำให้เว็บช้าลง ให้ประเมินว่าต้องการความถี่เท่าไรจริงๆ
ใช้ Redirect Output
# เก็บ log ไว้ดู
0 2 * * * /usr/local/bin/php /home/USER/backup.php >> /home/USER/cron.log 2>&1
# ไม่ต้องการ output เลย
0 2 * * * /usr/local/bin/php /home/USER/backup.php > /dev/null 2>&1
ทดสอบก่อน deploy
รัน script ด้วยมือก่อนเสมอ เพื่อให้แน่ใจว่าไม่มี error ก่อนตั้ง Cron
ตรวจสอบ Resource Limit
Hosting บางแพ็กเกจอาจมีการจำกัดจำนวน Cron Jobs หรือ CPU time ให้ตรวจสอบ spec ของแพ็กเกจที่ใช้อยู่ และหลีกเลี่ยงการรัน heavy task ในช่วงชั่วโมง peak
define('DISABLE_WP_CRON', true); แล้วตั้ง Cron Job ที่ DirectAdmin เรียก wp-cron.php แทน — วิธีนี้เสถียรกว่าและไม่กิน resource เวลา visitor เข้าเว็บ
คำถามที่พบบ่อย (FAQ)
Cron Job คืออะไร
Cron Job คืองานที่กำหนดให้รันอัตโนมัติตามเวลาที่ตั้งไว้บน Linux server เช่น ทุกวัน ทุกชั่วโมง หรือทุกนาที โดยใช้ cron daemon ในการควบคุม
DirectAdmin รองรับ Cron Job ไหม
รองรับครับ DirectAdmin มี Cron Jobs manager ในหน้าควบคุมโดยตรง ผู้ใช้สามารถตั้งค่าได้ง่ายโดยไม่ต้องแก้ไฟล์ crontab ด้วยตนเอง
Cron syntax 5 ตำแหน่งหมายถึงอะไร
5 ตำแหน่งของ cron syntax คือ นาที (0-59), ชั่วโมง (0-23), วันในเดือน (1-31), เดือน (1-12), วันในสัปดาห์ (0-7) ตามลำดับ เช่น 0 2 * * * = ทุกวัน เวลา 02:00 น.
ทำไม Cron Job ถึงไม่ทำงาน
สาเหตุที่พบบ่อยคือ path ไฟล์ไม่ถูกต้อง, script ไม่มีสิทธิ์ execute (chmod), PHP version ไม่ตรงกับที่ตั้งไว้ หรือ syntax ผิดในคำสั่ง ให้ตรวจสอบ log email จาก cron ด้วย
Cron Job กินทรัพยากร Hosting ไหม
Cron Job ที่รันบ่อยเกินไปหรือใช้เวลาประมวลผลนานอาจกิน CPU และ memory ของ Hosting ได้ ควรตั้งความถี่ให้เหมาะสม และหลีกเลี่ยงการรัน Cron ที่ heavy ในชั่วโมง peak
สามารถรัน PHP script ผ่าน Cron ได้ไหม
ได้ครับ ใช้คำสั่ง /usr/local/bin/php /home/USER/public_html/script.php หรือใช้ wget/curl เรียก URL ของ script ก็ได้ แต่วิธี PHP CLI ตรงกว่าและปลอดภัยกว่า
ต้องการใช้ Hosting ที่รองรับ Cron Job ผ่าน DirectAdmin? ดูแพ็กเกจ Hosting ของ AsiaGB →