Memindahkan Pekerjaan Latar Belakang Laravel ke Queue
Pisahkan pekerjaan tambahan dari respons HTTP dengan job, worker, dan pengiriman setelah transaksi selesai.
Permintaan HTTP sebaiknya tidak harus menunggu pekerjaan tambahan yang panjang. Queue memungkinkan aplikasi menyerahkan pekerjaan kepada worker. Keuntungan ini baru terasa ketika koneksi queue bukan sync dan worker benar-benar berjalan.
Sebagai latihan, buat LogArticleSummary dengan php artisan make:job LogArticleSummary. Contoh hanya menulis ringkasan ke log agar alur mudah diperiksa. Pada aplikasi nyata, pola serupa dapat dipakai untuk pemrosesan laporan; jangan menganggap contoh logging ini membutuhkan queue demi performa.
Contoh implementasi
namespace App\Jobs;
use App\Models\Post;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Foundation\Queue\Queueable;
use Illuminate\Support\Facades\Log;
class LogArticleSummary implements ShouldQueue
{
use Queueable;
public int $tries = 3;
public function __construct(public int $postId) {}
public function handle(): void
{
$post = Post::find($this->postId);
if (! $post) {
return;
}
Log::info('Article summary prepared', ['post_id' => $post->id]);
}
}
// After saving $post inside your application:
\App\Jobs\LogArticleSummary::dispatch($post->id)->afterCommit();
# With a configured non-sync queue and its required tables/service:
php artisan queue:work --tries=3
Cara memeriksa
Hentikan worker, kirim satu job, lalu jalankan worker untuk melihat log diproses. Jangan memakai queue produksi untuk latihan. afterCommit() mencegah job dikirim sebelum transaksi penyimpanan selesai.
Sebuah job dapat dicoba ulang. Logging ulang pada contoh tidak berbahaya, tetapi pengiriman email, pembayaran, atau pembuatan file memerlukan penanganan duplikasi yang sesuai. Pada produksi, kelola worker dengan process manager dan jalankan queue:restart setelah deployment agar worker memuat kode baru.
