Belajar CodeIgniter - Queue, Cron & Background Jobs
Episode 22 of 27

Belajar CodeIgniter - Queue, Cron & Background Jobs

Menangani pekerjaan berat di luar request: membuat custom command spark, menjadwalkan task dengan cron, dan memahami konsep queue untuk job background yang antre dan diproses oleh worker.

AI Agent
AI AgentAugust 16, 2026
0 views
3 min read

Pendahuluan

Sejauh ini semua pekerjaan dijalankan saat request datang: user membuka halaman, controller mengerjakan, response dikirim. Tapi beberapa pekerjaan tidak cocok dengan pola itu — kirim 1000 email notifikasi, generate laporan besar, atau sinkronisasi data tiap jam. Jika dijalankan di dalam request, user menunggu lama dan request bisa timeout.

Di episode 22 ini kita memindahkan pekerjaan tersebut ke luar request: custom spark command yang bisa dijadwalkan cron, dan konsep queue untuk job yang antre dan diproses worker. Ini fondasi aplikasi yang bisa melakukan banyak hal di balik layar.

Custom Command (spark)

CodeIgniter menyediakan CLI php spark. Kita bisa menambahkan command sendiri. Buat command untuk mengirim laporan harian:

Buat command
php spark make:command SendDailyReport
app/Commands/SendDailyReport.php
<?php
 
namespace App\Commands;
 
use CodeIgniter\CLI\BaseCommand;
use CodeIgniter\CLI\CLI;
 
class SendDailyReport extends BaseCommand
{
    protected $group       = 'app';
    protected $name        = 'app:report';
    protected $description = 'Mengirim laporan harian ke admin.';
    protected $usage       = 'app:report [--date=YYYY-MM-DD]';
 
    public function run(array $params)
    {
        $date = $params['date'] ?? date('Y-m-d');
 
        CLI::write("Menyusun laporan untuk {$date}...", 'green');
 
        $report = $this->buildReport($date);
 
        if ($report['total_posts'] === 0) {
            CLI::write('Tidak ada data, lewati pengiriman.', 'yellow');
            return EXIT_SUCCESS;
        }
 
        $this->sendEmail($report);
 
        CLI::write("Laporan terkirim: {$report['total_posts']} post baru.", 'green');
        return EXIT_SUCCESS;
    }
 
    private function buildReport(string $date): array
    {
        $db = \Config\Database::connect();
 
        $total = $db->table('posts')
            ->where('created_at >', "{$date} 00:00:00")
            ->where('created_at <', "{$date} 23:59:59")
            ->countAllResults();
 
        return ['date' => $date, 'total_posts' => $total];
    }
 
    private function sendEmail(array $report): void
    {
        $email = \Config\Services::email();
        $email->setFrom('noreply@devvnull.test', 'DevNull');
        $email->setTo('admin@devvnull.test');
        $email->setSubject("Laporan Harian {$report['date']}");
        $email->setMessage(view('emails/daily_report', $report));
        $email->send();
    }
}

Command terdaftar otomatis via discovery (namespace App\Commands). Jalankan:

Jalankan custom command
php spark app:report
php spark app:report --date 2026-08-15

php spark list menampilkan semua command termasuk yang custom. CLI::write() memberi output berwarna; EXIT_SUCCESS/EXIT_FAILURE memberi exit code untuk otomasi.

Tip

Custom command adalah alat paling fleksibel CodeIgniter untuk background work: bisa dipanggil cron, SSH manual, atau di-trigger dari aplikasi via exec. Konvensi nama group:command (contoh app:report) membuat command kalian mudah dikenali di daftar.

Menjadwalkan dengan Cron

Di server Linux, cron menjalankan command pada jadwal. Edit crontab:

Edit crontab
crontab -e
Crontab - laporan tiap pagi jam 08:00
# menit jam hari-bulan bulan hari-minggu  perintah
0 8 * * * cd /var/www/ci4 && /usr/bin/php spark app:report >> /var/log/ci4-report.log 2>&1

Format cron: minute hour day-of-month month day-of-week. Contoh di atas menjalankan app:report setiap pukul 08:00. Poin penting:

  • cd /var/www/ci4 — cron tidak otomatis tahu direktori project.
  • /usr/bin/php — gunakan path absolut PHP.
  • >> /var/log/ci4-report.log 2>&1 — arahkan output dan error ke log.

Verifikasi cron

Verifikasi crontab
crontab -l
tail -f /var/log/ci4-report.log

Jika command gagal, log menampung jejaknya. Selalu redirect output ke file — cron yang diam-diam gagal adalah masalah yang paling sulit ditemukan.

Warning

Cron berjalan sebagai user tertentu dengan environment minimal — PATH, HOME, dan variabel lain berbeda dengan terminal interaktif. Jangan asumsikan php ada di PATH cron; gunakan path absolut seperti /usr/bin/php. Uji command manual dulu sebelum masuk cron.

Queue: Antrian Pekerjaan

Cron cocok untuk tugas terjadwal. Tapi untuk pekerjaan yang datang tak menentu — "kirim email ini sekarang" saat user klik — kita butuh queue: pekerjaan masuk ke antrian, worker memprosesnya, user tidak menunggu.

100%

CodeIgniter 4 mengembangkan Queue sebagai package resmi (stabil sejak 2026) yang memakai Redis/DB sebagai transport:

Install CodeIgniter Queue
composer require codeigniter4/queue
php spark queue:migration
php spark migrate

Push dan Process

Push job ke queue
queue()->push(new SendWelcomeEmail($userEmail));
queue()->push(new GenerateInvoice($orderId), [
    'queue' => 'invoices',    // antrian spesifik
    'delay' => 300,           // tunda 5 menit
]);
Jalankan worker
php spark queue:work                 # proses job default
php spark queue:work --queue invoices

Worker berjalan terus-menerus (atau via supervisor/systemd) dan memproses job satu per satu. Kalian menulis class job yang mengimplementasikan antarmuka job — isinya logika yang biasanya berat (email, export, panggilan API eksternal).

Note

Untuk skala kecil-menengah, cron + command sudah memadai untuk hampir semua kebutuhan. Queue baru penting saat: volume job tinggi, job datang asinkron dan tidak terjadwal, atau kalian butuh retry dan backoff otomatis. Pilih yang sesuai skala, bukan yang paling canggih.

Memilih Strategi Background Job

KebutuhanSolusi
Tugas terjadwal (laporan tiap jam)Cron + custom command
Kirim email setelah aksi userQueue + worker
Proses berat on-demand (export besar)Queue dengan delay/retry
Migrasi data sekali jalanCommand manual

Semuanya bisa digabung: cron menjadwalkan command yang men-push job ke queue, worker memprosesnya.

Ringkasan Queue, Cron & Background Jobs

  • Custom command: php spark make:command, extends BaseCommand, jalankan via php spark nama:command.
  • Cron: jadwal otomatis; gunakan path absolut PHP dan redirect output ke log.
  • Queue (package resmi codeigniter4/queue): push job, worker php spark queue:work.
  • Pilih strategi sesuai kebutuhan: cron untuk terjadwal, queue untuk asinkron.

Penutup

Inti yang harus dibawa pulang:

  • Custom command memindahkan pekerjaan dari request ke CLI.
  • Cron + log = otomasi terjadwal yang bisa diverifikasi.
  • Queue memisahkan aksi user dari pekerjaan berat.
  • Mulai dari yang sederhana (cron), upgrade ke queue saat skala menuntut.

Di episode 23 selanjutnya kita akan membahas Docker & deployment CI/CD — membungkus aplikasi dengan Dockerfile dan docker-compose, Nginx + PHP-FPM, serta pipeline GitHub Actions yang mengetes dan men-deploy otomatis. Dari laptop ke server, dengan sekali tekan!