แก้ปัญหา WP-Cron ไม่ทำงานหรือทำให้เว็บช้า
หลายคนเข้าใจว่า WP-Cron คือระบบตั้งเวลาเหมือน Cron ของ Linux แต่ความจริงมันทำงานก็ต่อเมื่อมีคนเข้าเว็บเท่านั้น ผลที่ตามมาคือสองปัญหาที่ดูตรงข้ามกันแต่มาจากสาเหตุเดียว
เว็บที่มีคนเข้าน้อยจะมีงานค้างไม่ทำงาน เช่น การสำรองข้อมูลอัตโนมัติที่ไม่เคยรัน ส่วนเว็บที่มีคนเข้าเยอะจะหน่วง เพราะผู้เข้าชมบางคนต้องรอให้งานเบื้องหลังเสร็จก่อนที่หน้าเว็บจะโหลด
สิ่งที่ต้องเตรียม
- สิทธิ์แก้ไฟล์
wp-config.php - สิทธิ์ตั้ง Cron บนเซิร์ฟเวอร์ หรือ Scheduled Task บนแผงควบคุมโฮสติ้ง
- WP-CLI จะสะดวกที่สุด แต่ใช้ปลั๊กอิน WP Crontrol แทนได้
ขั้นตอนที่ 1: ดูงานที่ตั้งไว้ทั้งหมด
wp cron event list
ดูคอลัมน์ next_run_relative หากเห็นค่าเป็นลบหรือข้อความว่าเลยกำหนดมานาน แปลว่างานนั้นค้างไม่ได้ทำงาน
# นับงานที่เลยกำหนดแล้ว
wp cron event list --fields=hook,next_run_relative | grep -c 'ago'
# ดูตารางเวลาที่มี
wp cron schedule list
ตรวจว่าระบบทำงานได้หรือไม่
wp cron test
ขั้นตอนที่ 2: ปิด WP-Cron แล้วใช้ Cron จริง
nano /var/www/example.com/wp-config.php
เพิ่มก่อนบรรทัด /* That's all, stop editing! */
define('DISABLE_WP_CRON', true);
ตั้ง Cron ของระบบให้เรียกแทน
sudo crontab -u www-data -e
# เรียกทุก 5 นาที ผ่าน PHP โดยตรง ซึ่งเร็วกว่าและไม่กิน worker ของเว็บ
*/5 * * * * cd /var/www/example.com && /usr/bin/php wp-cron.php >/dev/null 2>&1
หรือเรียกด้วย WP-CLI ซึ่งให้การควบคุมที่ดีกว่าและบันทึกผลได้
*/5 * * * * cd /var/www/example.com && /usr/local/bin/wp cron event run --due-now --quiet >> /var/log/wp-cron.log 2>&1
อย่าเรียกผ่าน curl หรือ wget ไปที่ URL ของเว็บ เพราะจะใช้ worker ของ PHP-FPM ที่ควรเอาไว้บริการผู้ใช้จริง และหากเว็บมี Basic Auth หรืออยู่หลัง Cloudflare จะยิ่งซับซ้อน
ตรวจว่า Cron ทำงาน
sudo tail -f /var/log/wp-cron.log
wp cron event list | head
ขั้นตอนที่ 3: จัดการงานที่ค้างสะสม
# สั่งรันงานที่ถึงกำหนดทั้งหมดทันที
wp cron event run --due-now
# รันงานเฉพาะตัว
wp cron event run wp_scheduled_delete
หากมีงานค้างจำนวนมากจนรันทีเดียวไม่ไหว ให้ทยอยรัน และตรวจว่างานนั้นยังจำเป็นหรือไม่
ขั้นตอนที่ 4: ลบงานของปลั๊กอินที่ถอนไปแล้ว
ปลั๊กอินจำนวนมากไม่ล้างงานของตัวเองตอนถอนการติดตั้ง ทำให้มีงานที่ชี้ไปยังฟังก์ชันที่ไม่มีอยู่จริง ซึ่งสร้างข้อผิดพลาดใน Log ทุกครั้งที่ถึงกำหนด
# ดูรายชื่อ hook ทั้งหมด
wp cron event list --fields=hook | sort | uniq -c | sort -rn
# ลบงานของ hook ที่ไม่ใช้แล้ว
wp cron event delete ชื่อ_hook_ของปลั๊กอินเก่า
ตรวจว่า hook นั้นมีโค้ดรองรับอยู่จริงหรือไม่
grep -rn "ชื่อ_hook" /var/www/example.com/wp-content/plugins/ | head
หากไม่พบอะไรเลย แปลว่าเป็นงานกำพร้าและลบได้อย่างปลอดภัย
ขั้นตอนที่ 5: หางานที่ทำให้เว็บช้า
# ดูเวลาที่แต่ละงานใช้
wp cron event run --due-now --debug 2>&1 | grep -E 'Executed|took'
ใช้ปลั๊กอิน Query Monitor เปิดแท็บ Transients และ HTTP API Calls ซึ่งมักเผยว่างานไหนเรียก API ภายนอกที่ตอบช้า
งานที่มักเป็นปัญหา
- งานตรวจสอบการอัปเดตของปลั๊กอินและธีม ซึ่งเรียกเซิร์ฟเวอร์ภายนอกหลายแห่ง
- งานส่งอีเมลจำนวนมากในรอบเดียว
- งานสร้างขนาดรูปภาพใหม่
- งานของปลั๊กอินสำรองข้อมูลที่ทำงานตอนที่มีคนเข้าเว็บเยอะ
ขั้นตอนที่ 6: ตั้งเวลาให้เหมาะสม
ย้ายงานหนักไปทำตอนกลางคืน โดยลบงานเดิมแล้วตั้งใหม่
# ลบงานเดิม
wp cron event delete my_heavy_task
# ตั้งใหม่ให้เริ่มตอนตีสองของวันพรุ่งนี้ แล้วทำซ้ำทุกวัน
wp cron event schedule my_heavy_task "tomorrow 2am" daily
สร้างช่วงเวลาของตัวเองได้หากตัวเลือกมาตรฐานไม่พอ
add_filter('cron_schedules', function ($schedules) {
$schedules['every_15_minutes'] = array(
'interval' => 900,
'display' => 'ทุก 15 นาที',
);
return $schedules;
});
ขั้นตอนที่ 7: เฝ้าดูว่า Cron ยังทำงานอยู่
ปัญหาที่อันตรายที่สุดคือ Cron หยุดทำงานเงียบ ๆ แล้วไม่มีใครรู้จนกระทั่งพบว่าไม่มีข้อมูลสำรองมาสามเดือน
ใช้ระบบเฝ้าระวังแบบ Push โดยให้สคริปต์แจ้งเข้ามาทุกครั้งที่ทำงานสำเร็จ หากไม่มีการแจ้งภายในเวลาที่กำหนดจะถือว่าผิดปกติ
*/5 * * * * cd /var/www/example.com && /usr/local/bin/wp cron event run --due-now --quiet && curl -fsS -m 10 https://status.example.com/api/push/abc123 >/dev/null
ตั้งการตรวจสอบชนิด Push ใน Uptime Kuma ให้แจ้งเตือนหากไม่มีสัญญาณเกิน 15 นาที
ปัญหาที่พบบ่อย
ปิด DISABLE_WP_CRON แล้วงานไม่ทำงานเลย
ลืมตั้ง Cron ของระบบ ตรวจด้วย sudo crontab -u www-data -l และตรวจว่าพาธของ PHP และโฟลเดอร์เว็บถูกต้อง ทดสอบด้วยการรันคำสั่งใน crontab ด้วยมือก่อน
Cron รันแล้วแต่ขึ้นข้อผิดพลาดเรื่องสิทธิ์
ต้องรันด้วยผู้ใช้เดียวกับที่เว็บเซิร์ฟเวอร์ใช้ ปกติคือ www-data ไม่ใช่ root เพราะไฟล์ที่สร้างขึ้นจะมีเจ้าของผิดและเว็บเขียนทับไม่ได้
งานเดิมทำงานซ้ำหลายครั้ง
อาจมีทั้ง WP-Cron และ Cron ของระบบทำงานพร้อมกัน ตรวจว่าตั้ง DISABLE_WP_CRON เป็น true แล้ว และไม่ได้ตั้ง Cron ซ้ำหลายรายการ
wp cron test ขึ้นว่าล้มเหลว
มักเกิดจากเว็บเรียกตัวเองไม่ได้ เช่น มี Basic Auth หรือ DNS ภายในชี้ผิด ซึ่งไม่เป็นปัญหาอีกต่อไปเมื่อเปลี่ยนไปใช้ Cron ของระบบตามคู่มือนี้ เพราะไม่ต้องเรียกผ่าน HTTP แล้ว
ต้องการโฮสติ้งที่ตั้ง Cron ให้ถูกต้องตั้งแต่ต้น ติดต่อ THAI DATA CLOUD ได้ที่ https://thaidata.cloud/contact/
- Categories:
- Cloud
- Tags:
- Cloud
- Cloud Server
Related Posts
หมวดหมู่ที่น่าสนใจ
- Account Settings
- AD Server
- AI
- Alibaba Cloud
- Anti-Spam Gateway
- AWS Amazon Web Services
- Campaign
- CentOS/AlmaLinux
- Cloud
- Cloud Backup
- Cloud Communication
- Cloud Migration
- Cloud Security
- Cloud Server Management
- Cloud Solution
- Cloud Solution for Government
- Cloud Solutions by Industry
- Cloud Storage
- Cloud VPS App Plus +
- Cloud VPS DirectAdmin
- Cloud VPS Plesk
- CSR
- Cyber Security
- Cybersecurity
- Data Sovereignty
- Database Server
- DDoS
- Digital Tranformation
- Digital Transformation
- Direct Mail
- Directadmin
- Domainname
- Ecommerce
- ERP
- Generative AI
- Getting Started
- Google Cloud
- Google G Suite
- Huawei Cloud
- IT News
- Linux Server
- Managed Cloud Services
- Managed Service Provider
- Manual
- Microsoft
- Microsoft 365
- Microsoft Azure
- News
- On-premise
- Private Mail Server
- Promotion
- Recommend Solution (Enterprise)
- Server
- Sovereign Cloud
- THAI DATA CLOUD Platform
- Ubuntu
- Ubuntu
- Uncategorized
- VMware
- VPS Server
- Web Design
- Web Hosting
- Web Hosting (DirectAdmin)
- Web Hosting (Plesk)
- Web Technologies
- Windows Server
- Wordpress
- Zimbra
- เรื่องราวความประทับใจ
- โซลูชันสำหรับธุรกิจการผลิตและยานยนต์
- โซลูชันสำหรับธุรกิจการศึกษา
- โซลูชันสำหรับธุรกิจการเงิน
- โซลูชันสำหรับธุรกิจขนส่งและกระจายสินค้า
- โซลูชันสำหรับธุรกิจค้าปลีก
- โซลูชันสำหรับธุรกิจท่องเที่ยว
- โซลูชันสำหรับธุรกิจบริการสุขภาพและโรงพยาบาล
- โซลูชันสำหรับธุรกิจประกันภัย
- โซลูชันสำหรับธุรกิจพลังงานและสาธารณูปโภค
- โซลูชันสำหรับธุรกิจสื่อสารมวลชนและเอ็นเตอร์เทนเมนท์
- โซลูชันสำหรับธุรกิจอสังหาริมทรัพย์
- โซลูชันสำหรับธุรกิจเทคโนโลยี








