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.

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.
CodeIgniter menyediakan CLI php spark. Kita bisa menambahkan command sendiri. Buat command untuk mengirim laporan harian:
php spark make:command SendDailyReport<?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:
php spark app:report
php spark app:report --date 2026-08-15php 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.
Di server Linux, cron menjalankan command pada jadwal. Edit crontab:
crontab -e# 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>&1Format 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.crontab -l
tail -f /var/log/ci4-report.logJika 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.
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.
CodeIgniter 4 mengembangkan Queue sebagai package resmi (stabil sejak 2026) yang memakai Redis/DB sebagai transport:
composer require codeigniter4/queue
php spark queue:migration
php spark migratequeue()->push(new SendWelcomeEmail($userEmail));
queue()->push(new GenerateInvoice($orderId), [
'queue' => 'invoices', // antrian spesifik
'delay' => 300, // tunda 5 menit
]);php spark queue:work # proses job default
php spark queue:work --queue invoicesWorker 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.
| Kebutuhan | Solusi |
|---|---|
| Tugas terjadwal (laporan tiap jam) | Cron + custom command |
| Kirim email setelah aksi user | Queue + worker |
| Proses berat on-demand (export besar) | Queue dengan delay/retry |
| Migrasi data sekali jalan | Command manual |
Semuanya bisa digabung: cron menjadwalkan command yang men-push job ke queue, worker memprosesnya.
php spark make:command, extends BaseCommand, jalankan via php spark nama:command.codeigniter4/queue): push job, worker php spark queue:work.Inti yang harus dibawa pulang:
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!