ตั้งค่า Cron Job บน Hosting DirectAdmin ให้ทำงานอัตโนมัติตามเวลา
สารบัญ
Cron Job เป็นหนึ่งในเครื่องมือที่ขาดไม่ได้สำหรับเว็บมาสเตอร์ที่ต้องการให้เว็บไซต์ทำงานอัตโนมัติ ตั้งแต่ส่งอีเมล สำรองข้อมูล ล้าง cache ไปจนถึงดึงข้อมูลจาก API ทุกอย่างทำได้โดยไม่ต้องนั่งรอหรือกดด้วยมือ บทความนี้จะอธิบายครบทุกขั้นตอนสำหรับ Hosting ที่ใช้ DirectAdmin
1. Cron Job คืออะไร
Cron คือ time-based job scheduler ในระบบปฏิบัติการ Unix/Linux ส่วน Cron Job คือคำสั่ง script หรือโปรแกรมที่ถูกกำหนดให้ทำงานอัตโนมัติตามตารางเวลาที่ระบุไว้ใน crontab (cron table)
บน Hosting ที่ใช้ DirectAdmin คุณสามารถสร้างและจัดการ Cron Job ได้ผ่านหน้า Control Panel โดยไม่ต้องเข้าถึง server โดยตรง ระบบจะรันคำสั่งของคุณตามเวลาที่กำหนดอย่างแม่นยำ
2. ทำไมต้องใช้ Cron Job บน Hosting
งานที่ควรใช้ Cron Job แทนการกดด้วยมือมีหลายประเภท:
- Backup ข้อมูลอัตโนมัติ — สำรองฐานข้อมูลหรือไฟล์ตามกำหนด
- ส่งอีเมลหรือ newsletter — สั่งให้ script ส่งอีเมลตามเวลา
- ล้าง Cache — เคลียร์ session หรือ temp files เป็นประจำ
- ดึงข้อมูล (Fetch) — ดึง feed, API หรืออัปเดต exchange rate
- WordPress Cron — รัน WP-Cron เพื่อ publish scheduled posts
- Generate Report — สร้างรายงานสถิติรายวัน/รายสัปดาห์
- Renew Token — รีเฟรช OAuth token ก่อนหมดอายุ
3. เข้าถึง Cron Jobs ใน DirectAdmin
ขั้นตอนเปิดหน้า Cron Jobs บน DirectAdmin:
- เข้าสู่ระบบ DirectAdmin ที่
yourdomain.com:2222 - ที่ section Advanced Features คลิก Cron Jobs
- หน้าจอจะแสดง Cron Jobs ที่มีอยู่ และฟอร์มสำหรับเพิ่มใหม่
4. รูปแบบ Cron Expression
Cron Expression ประกอบด้วย 5 ฟิลด์ คั่นด้วยช่องว่าง:
* * * * * คำสั่ง
│ │ │ │ │
│ │ │ │ └── วันในสัปดาห์ (0-7, 0=อาทิตย์)
│ │ │ └──── เดือน (1-12)
│ │ └────── วันที่ (1-31)
│ └──────── ชั่วโมง (0-23)
└────────── นาที (0-59)
อักขระพิเศษที่ใช้ได้:
| อักขระ | ความหมาย | ตัวอย่าง |
|---|---|---|
* | ทุกค่า | * * * * * = ทุกนาที |
, | หลายค่า | 0 9,18 * * * = 9 โมง และ 6 โมงเย็น |
- | ช่วงค่า | 0 9-17 * * * = ทุกชั่วโมง 9.00–17.00 |
/ | ทุกๆ | */15 * * * * = ทุก 15 นาที |
5. ตัวอย่าง Cron Job ที่ใช้บ่อย
5.1 รันทุกวันตอนเที่ยงคืน
0 0 * * * /usr/local/bin/php /home/user/public_html/backup.php
5.2 รันทุก 15 นาที
*/15 * * * * /usr/local/bin/php /home/user/public_html/queue.php
5.3 รันทุกวันจันทร์เวลา 8 โมงเช้า
0 8 * * 1 /usr/local/bin/php /home/user/public_html/weekly-report.php
5.4 รันวันที่ 1 ของทุกเดือน
0 1 1 * * /usr/local/bin/php /home/user/public_html/monthly-cleanup.php
5.5 Fetch URL ด้วย wget
*/30 * * * * wget -q -O /dev/null https://yourdomain.com/cron/fetch.php
6. ตั้งค่า Cron Job ทีละขั้นตอน
ขั้นตอนการเพิ่ม Cron Job ใหม่ใน DirectAdmin:
- ใน DirectAdmin เปิดหน้า Cron Jobs
- กรอกฟิลด์ Minutes เช่น
0หรือ*/15 - กรอกฟิลด์ Hours เช่น
2(ตี 2) - กรอก Day, Month, Weekday ตามต้องการ (ใส่
*หากต้องการทุกวัน/เดือน) - กรอกคำสั่งที่ Command เช่น:
/usr/local/bin/php /home/yourusername/public_html/script.php
- คลิก Add เพื่อบันทึก
6.1 หา Path ของ PHP ที่ถูกต้อง
PHP path บน server ที่ใช้บ่อย:
| เวอร์ชัน | Path |
|---|---|
| PHP 8.3 | /usr/local/php83/bin/php |
| PHP 8.2 | /usr/local/php82/bin/php |
| PHP 8.1 | /usr/local/php81/bin/php |
| PHP default | /usr/local/bin/php |
สามารถตรวจสอบ PHP path จริงได้โดยขอ Support ของ Hosting หรือดูจาก DirectAdmin → PHP Selector
7. Cron Job สำหรับ WordPress
โดยปกติ WordPress ใช้ WP-Cron ที่ทำงานเมื่อมีผู้เยี่ยมชมเว็บ ซึ่งไม่แม่นยำและเปลืองทรัพยากร วิธีที่ดีกว่าคือ:
7.1 ปิด WP-Cron
เพิ่มบรรทัดนี้ใน wp-config.php ก่อนบรรทัด /* That's all, stop editing! */:
define('DISABLE_WP_CRON', true);
7.2 ตั้ง Real Cron Job ใน DirectAdmin
เพิ่ม Cron Job ที่รันทุก 5 นาที:
*/5 * * * * /usr/local/bin/php /home/yourusername/public_html/wp-cron.php > /dev/null 2>&1
หรือใช้ wget:
*/5 * * * * wget -q -O - https://yourdomain.com/wp-cron.php?doing_wp_cron > /dev/null 2>&1
8. การตรวจสอบและแก้ไขปัญหา
Cron Job ไม่ทำงาน? ลองตรวจสอบตามลำดับนี้:
8.1 ตรวจสอบ Output ของ Cron
แก้ Command ให้ redirect error มาที่ไฟล์ log:
/usr/local/bin/php /home/user/public_html/script.php >> /home/user/cron.log 2>&1
แล้วดูไฟล์ cron.log ผ่าน File Manager ใน DirectAdmin
8.2 ปัญหาที่พบบ่อยและวิธีแก้
| ปัญหา | สาเหตุ | วิธีแก้ |
|---|---|---|
| Cron ไม่รัน | Path PHP ผิด | ใช้ full path เช่น /usr/local/bin/php |
| Script error | Code มีบั๊ก | ทดสอบรัน script โดยตรงก่อน |
| สิทธิ์ถูกปฏิเสธ | chmod ผิด | ตั้ง chmod 755 script.php |
| Memory limit | งานหนักเกิน | ลด scope หรือแตก task เล็กลง |
| รันบ่อยเกิน | overlap | เพิ่ม lock file ป้องกัน concurrent run |
8.3 ใช้ Lock File ป้องกัน Concurrent Run
<?php
$lock = '/tmp/myscript.lock';
if (file_exists($lock)) exit;
touch($lock);
// งานของคุณที่นี่
unlink($lock);
?>
9. ตาราง Cron Expression อ้างอิง
| Expression | ความหมาย |
|---|---|
* * * * * | ทุกนาที |
*/5 * * * * | ทุก 5 นาที |
*/15 * * * * | ทุก 15 นาที |
0 * * * * | ทุกชั่วโมง (นาทีที่ 0) |
0 0 * * * | ทุกวันเที่ยงคืน |
0 2 * * * | ทุกวันตี 2 |
0 8 * * 1 | ทุกวันจันทร์ 8.00 น. |
0 0 1 * * | วันที่ 1 ของทุกเดือน |
0 0 1,15 * * | วันที่ 1 และ 15 ของเดือน |
0 9-17 * * 1-5 | ทุกชั่วโมงในเวลางาน วันจ.-ศ. |
10. สรุป
Cron Job บน Hosting DirectAdmin เป็นเครื่องมือทรงพลังที่ช่วยให้เว็บไซต์ทำงานอัตโนมัติ สิ่งสำคัญที่ต้องจำ:
- ใช้ full path สำหรับ PHP เสมอ
- Redirect output ไปที่ log file เพื่อ debug
- WordPress ควร disable WP-Cron แล้วใช้ Real Cron แทน
- ใช้ lock file ป้องกัน concurrent run สำหรับงานที่ใช้เวลานาน
- เริ่มจาก interval ห่างๆ ก่อน แล้วค่อยปรับตามความต้องการ
คำถามที่พบบ่อย
0 2 * * * หมายถึงรันทุกวันตอนตี 2define('DISABLE_WP_CRON', true); แล้วตั้ง Cron Job จริงใน DirectAdmin ให้รัน php ไปที่ wp-cron.php ทุก 5–15 นาที