Menjalankan WordPress Cron Menggunakan systemd

1 min read

Disclaimer
Saya bekerja di AWS, semua opini adalah dari saya pribadi. (I work for AWS, my opinions are my own.)
Wordpress Cron menggunakan dystemd
Photo by Fikret tozak on Unsplash

Ini adalah artikel re-publish dengan beberapa modifikasi. Artikel asli ada pada Medium dari Rio Astamal.

TeknoCerdas.com – WordPress memiliki mekanisme sendiri dalam melakukan penjadwalan atau otomasi disebut WP-Cron. Pada website WordPress normal Anda tidak perlu melakukan apapun untuk membuat penjadwalan otomatis ini berjalan.

Ketika website WordPress dikunjungi atau mendapat hits maka secara otomatis WordPress juga akan menjalankan cron secara berkala.

Kekurangan utama instalasi WP Cron normal diatas adalah adalah kemungkinan untuk cron tidak berjalan cukup besar. Contohnya adalah jika ada jadwal yang harus berjalan pada jam 10 pagi namun tidak ada kunjungan pada website hingga jam 8 malam maka eksekusi cron tidak berjalan sesuai ekspektasi.

Kekurangan lain adalah jika website Anda memiliki traffic yang cukup tinggi maka WordPress akan melakukan pengecekan cron terus-menerus. Ini tentu memakan sumber daya pada sisi server.

Membuat daemon WP-Cron menggunakan shell script

Saat ini hampir semua distribusi Linux populer sudah menggunakan systemd untuk konfigurasi sistem. Solusi masalah diatas adalah dengan mendelegasikan ke sistem operasi yaitu dengan menjalankan WordPress Cron menggunakan systemd.

Hal yang harus kita lakukan adalah membuat sebuah penjadwalan agar mengeksekusi URL halaman wp-cron.php pada root direktori WordPress. Sebagai contoh https://example.com/wp-cron.php.

Selanjutnya adalah kita akan membuat sebuah daemon yang secara berkala mengeksekusi wp-cron.php.

$ cat > /home/user/wp-cron.sh
#!/bin/bash
SYNC_EVERY_SECONDS=$1

# Take from arg or default to 30 seconds
[ -z "$SYNC_EVERY_SECONDS" ] && SYNC_EVERY_SECONDS=30

# URL to hit
WP_CRON_URL="https://example.com/wp-cron.php"

while :
do
 echo "> Visiting ${WP_CRON_URL}..."
 wget "$WP_CRON_URL" >/dev/null

 echo "> Waiting ${SYNC_EVERY_SECONDS} seconds before starting again..."
 sleep $SYNC_EVERY_SECONDS
done

Inti dari shell script diatas adalah melakukan melakukan hit ke URL wp-cron.php setiap X detik. Misal kita simpan pada lokasi: /home/user/wp-cron.sh.

Menjalankan daemon menggunakan systemd

Agar daemon script diatas dijalankan waktu boot dan otomatis dijalankan ketika script mati maka perlu dibuatkan systemd service. Lanjutkan dengan membuat sebuah service dengan nama wp-cron.service.

$ cat <

Setelah itu aktifkan dengan perintah berikut.

$ sudo systemctl start wp-cron.service
$ sudo systemctl enable wp-cron.service

Cek apakah service sudah berjalan dengan perintah status.

$ sudo systemctl status wp-cron
● wp-cron.service - Simple WordPress CRON daemon
   Loaded: loaded (/etc/systemd/system/wp-cron.service; enabled; vendor preset: enabled)
   Active: active (running) since Thu 2020-04-30 22:39:22 UTC; 19min ago
 Main PID: 25316 (bash)
    Tasks: 2 (limit: 1152)
   CGroup: /system.slice/wp-cron.service
           ├─25316 /bin/bash /home/user/wp-cron.sh
           └─28496 sleep 30
           
Apr 30 22:55:59 ip-172-31-34-100 bash[25316]: > Visiting https://example.com/wp-cron.php...
Apr 30 22:55:59 ip-172-31-34-100 bash[25316]: > Waiting 30 seconds before starting again...

Alasan tidak menggunakan cronjob

Terdapat beberapa alasan kenapa penulis tidak menggunakan cronjob dan lebih memilih menjalankan WordPress cron menggunakan systemd.

  1. Maksimal interval terkecil adalah eksekusi per menit. Jika kita ingin mengeksusi per 20 detik maka tidak dapat dilakukan.
  2. Menghindari kemunginan tumpang tindih jobs. Jika job 1 belum selesai ada kemungkinan job 2 sudah menyusul. Dengan menggunakan infinite loop maka kita dapat pastikan hanya satu cron yang berjalan dalam satu waktu.