Cron Job คืออะไร?
Cron Job คือการตั้งเวลารันคำสั่งหรือสคริปต์บนเซิร์ฟเวอร์โดยอัตโนมัติตามกำหนดเวลา เช่น ทุก 5 นาที ทุกชั่วโมง หรือทุกวันเที่ยงคืน ชื่อ "Cron" มาจาก Kronos เทพเจ้าแห่งเวลาในตำนานกรีก
ตัวอย่างการใช้งาน Cron Job ที่พบบ่อย ได้แก่: Backup ฐานข้อมูลรายวัน, ส่ง Email สรุปรายสัปดาห์, ล้าง Cache ทุกชั่วโมง, รัน WordPress WP-Cron สำหรับ Scheduled Posts, ตรวจสอบ SSL Certificate ใกล้หมดอายุ, และดาวน์โหลด Feed ข่าวสาร
เข้าใจ Crontab Syntax
รูปแบบมาตรฐาน crontab ประกอบด้วย 5 ฟิลด์ก่อนคำสั่ง:
# ┌──── นาที (0-59)
# │ ┌──── ชั่วโมง (0-23)
# │ │ ┌──── วันที่ (1-31)
# │ │ │ ┌──── เดือน (1-12)
# │ │ │ │ ┌──── วันในสัปดาห์ (0=อาทิตย์, 7=อาทิตย์)
# │ │ │ │ │
# * * * * * command
# ตัวอย่าง:
0 * * * * # ทุกชั่วโมง (นาทีที่ 0)
*/5 * * * * # ทุก 5 นาที
0 2 * * * # ทุกวัน เวลา 02:00
0 0 * * 0 # ทุกวันอาทิตย์ เที่ยงคืน
0 0 1 * * # วันที่ 1 ของทุกเดือน เที่ยงคืน
ตั้งค่า Cron Job ใน cPanel
- ล็อกอิน cPanel แล้วไปที่หมวด Advanced
- คลิก Cron Jobs
- ในส่วน Add New Cron Job กำหนดความถี่ผ่าน Dropdown หรือกรอกเอง
- ในช่อง Command ใส่คำสั่งที่ต้องการรัน
- คลิก Add New Cron Job
ควรใส่ Email ที่ส่วน Cron Email เพื่อรับ Output ของ Cron Job ทุกครั้งที่รัน ถ้าไม่ต้องการรับ Email ให้เพิ่ม > /dev/null 2>&1 ต่อท้ายคำสั่ง
ตัวอย่าง Cron Jobs ที่ใช้งานบ่อย
WordPress WP-Cron
WordPress ใช้ WP-Cron สำหรับ Scheduled Posts, Plugin Tasks และ Automatic Updates แต่โดย Default WP-Cron จะทำงานเมื่อมีผู้เยี่ยมชมเว็บเท่านั้น ถ้าเว็บมี Traffic น้อย งานที่ตั้งเวลาไว้อาจไม่รัน:
# รัน WP-Cron ผ่าน PHP CLI ทุก 5 นาที
*/5 * * * * /usr/local/bin/php /home/username/public_html/wp-cron.php > /dev/null 2>&1
# รัน WP-CLI (ถ้า Hosting รองรับ)
*/5 * * * * /usr/local/bin/wp --path=/home/username/public_html cron event run --due-now > /dev/null 2>&1
แล้วเพิ่มใน wp-config.php เพื่อปิด WP-Cron ตาม HTTP:
define('DISABLE_WP_CRON', true);
Backup Database อัตโนมัติ
# Backup MySQL ทุกวันเวลา 02:00 เก็บไว้ 7 วัน
0 2 * * * /usr/bin/mysqldump -u dbuser -pDBPASS dbname | gzip > /home/username/backups/db_$(date +\%Y\%m\%d).sql.gz && find /home/username/backups/ -name "db_*.sql.gz" -mtime +7 -delete > /dev/null 2>&1
ล้าง Temp Files
# ลบไฟล์ tmp เก่ากว่า 7 วันทุกสัปดาห์
0 3 * * 0 find /home/username/public_html/tmp/ -mtime +7 -delete > /dev/null 2>&1
ส่ง Email เมื่อ Cron Job รัน
ตั้ง Cron Email ที่ด้านบนของหน้า Cron Jobs ใน cPanel จากนั้นทุกครั้งที่ Cron รัน Output จะถูกส่งมายัง Email นั้น ถ้าต้องการ Email เฉพาะเมื่อ Error ให้ใช้:
# ส่ง Email เฉพาะเมื่อ Error (ไม่ส่งเมื่อสำเร็จ)
0 2 * * * /path/to/script.sh 2>&1 | grep -i "error\|fail" | mail -s "Cron Error" [email protected]
ตรวจสอบว่า Cron Job ทำงานถูกต้อง
# ตรวจสอบ Cron Job ที่ตั้งไว้ทั้งหมด (ผ่าน SSH)
crontab -l
# ดู Cron Log (ถ้า Hosting รองรับ)
grep CRON /var/log/syslog | tail -50
# ทดสอบ Script รันได้ก่อนตั้ง Cron
php /home/username/public_html/wp-cron.php
# ตรวจสอบ PHP Path บนเซิร์ฟเวอร์
which php
/usr/local/bin/php --version
แก้ปัญหาที่พบบ่อย
Cron ไม่รันตามเวลาที่กำหนด
ตรวจสอบ Timezone ของ Cron Job ในหน้า cPanel จะระบุว่าใช้ Timezone ใด (มักเป็น UTC ของเซิร์ฟเวอร์) ถ้าต้องการรันเวลา 02:00 ตามเวลาไทย (UTC+7) ต้องตั้งเป็น 19:00 UTC แทน
Cron รันแต่ Script ไม่ทำงาน — Path ไม่ถูก
Cron Job ทำงานใน Environment ที่จำกัด ไม่มีตัวแปร PATH เหมือน Shell ปกติ ต้องใส่ Full Path ของทั้ง PHP และ Script:
# ผิด (อาจหา php ไม่เจอ)
php script.php
# ถูก (ใส่ Full Path)
/usr/local/bin/php /home/username/public_html/script.php
Cron รันแล้วได้ Error เกี่ยวกับ Environment Variables
Script ที่พึ่งพา Environment Variable เช่น $HOME, $PATH อาจทำงานไม่ได้ใน Cron ให้เพิ่ม Export ที่ต้นสคริปต์ หรือใช้ Absolute Path ทุกอย่างใน Script
Cron สร้าง Error Log ขนาดใหญ่
ถ้า Cron รันบ่อยและมี Output มาก จะสร้าง Log ขนาดใหญ่ ให้เพิ่ม > /dev/null 2>&1 ต่อท้ายคำสั่งเพื่อทิ้ง Output ทั้งหมด หรือ Redirect ไปยังไฟล์ Log ที่จัดการเองได้
คำถามที่พบบ่อย
Cron Job บน Shared Hosting มีข้อจำกัดอะไรบ้าง?
Shared Hosting มักจำกัดความถี่ต่ำสุดไว้ที่ทุก 1 นาที หรือบางรายทุก 5 นาที นอกจากนี้ยังมีข้อจำกัดด้าน CPU Time และ Memory สำหรับแต่ละ Cron Job ถ้าต้องการรันงานหนักหรือบ่อยมาก ควรพิจารณา VPS แทน
Cron Job กับ WordPress WP-Cron ต่างกันอย่างไร?
WP-Cron เป็น Cron ระดับ Application ที่ WordPress จัดการเอง ทำงานโดยตรวจสอบเมื่อมีผู้เยี่ยมชมเว็บ จึงไม่แม่นยำด้านเวลา Server Cron Job ทำงานตรงเวลาจริงและน่าเชื่อถือกว่ามาก โดยเฉพาะสำหรับเว็บที่มี Traffic น้อย
จะรู้ได้อย่างไรว่า Cron ทำงานสำเร็จ?
วิธีที่ง่ายที่สุดคือให้ Cron Job เขียน Timestamp ลงไฟล์ Log ทุกครั้งที่รัน เช่น echo "Ran at $(date)" >> /home/username/cron.log แล้วตรวจสอบไฟล์ Log ว่ามี Timestamp ล่าสุดหรือไม่