Membuat dan Mendaftarkan Task Scheduling Laravel

mithicher
I Wayan Adi Sparta Sep, 28 2022 04:51 AM
148

Pernahkan anda memilliki project yang secara terjadwal melakukan suatu aksi? Misalkan anda memiliki sebuah website yang menampung data user termasuk tanggal lahirnya. Anda menambahkan suatu fitur tambahan dimana ketika pada jam 12 malam, dan apabila tanggal tersebut sama dengan tanggal lahir user, maka project akan secara otomatis mengirimkan pesan Selamat Ulang Tahun kepada user bersangkutan.

Apabila kasus diatas anda lakukan secara manual, hal tersebut akan sangat membuang tenaga anda, karena setiap jam 12 malam anda harus membuka sistem kemudian menekan suatu tombol yang men-trigger fungsi tersebut. Nah, Task Scheduling merupakan solusi dari permasalahan tersebut.

Konsep dari Task Scheduling adalah, pertama anda akan membuat fungsi utama dari proses yang akan anda lakukan misalkan fungsi untuk mengirim ucapan selamat seperti contoh diatas. Selanjutnya fungsi tersebut harus anda atur sedemikian rupa agar dapat dipanggil melalui perintah command prompt. Terakhir, command untuk memanggil fungsi tersebut akan didaftarkan disuatu script yang bernama crontab pada server. Pada crontab inilah anda memasang script dan waktu script tersebut harus dijalankan. Misalkan script akan dijalankan setiap menit, setiap jam, 2 jam sekali, atau pukul 2 dini hari dan sebagainya.

Kelemahan dari crontab ini adalah, apabila anda ingin mengatur ulang waktu atau menambah perintah baru, anda harus melakukan konfigurasi ulang pada server. Tentunya hal ini akan merepotkan apalagi apabila teknisi yang mengatur server dan developer adalah orang yang berbeda.

Permasalahan inilah yang dapat diselesaikan oleh Task Scheduling Laravel. Anda hanya perlu mendaftarkan 1 perintah pada crontab, kemudian apabila anda memiliki fungsi baru atau mengatur fungsi sebelumnya, anda hanya perlu mengaturnya pada sisi aplikasi atau project anda.

Persiapan

Sebelum dapat mengimplementasikan Task Scheduling Laravel, anda sebelumnya harus sudah terbiasa menggunakan command php artisan. Apabila sudah, anda dapat langsung lanjut ke proses pembuatan Task Scheduling.

Tahap Pembuatan

1. Membuat Command

Tahap pertama dari Task Scheduling adalah pembuatan command. Sebenarnya command ini adalah modul yang terpisah dengan Task Scheduling. Anda tetap dapat menjalankan command tanpa mendaftarkannya sebagai Task Scheduling.

Untuk membuat command, anda dapat lakukan dengan menggunakan perintah artisan:

php artisan make:command CmdUcapanUlangTahun

Dari perintah diatas, adapun penjelasannya adalah sebagai berikut:

  • php artisan, digunakan untuk memanggil php artisan
  • make:command, merupakan perintah yang digunakan untuk membuat command
  • CmdUcapanUlangTahun, merupakan nama class yang akan digunakan

Kemudian setelah perintah berhasil dijalankan, buka class tersebut yang akan berada pada app/Console/Commands/CmdUcapanUlangTahun.php

<?php

namespace App\Console\Commands;

use Illuminate\Console\Command;

class CmdUcapanUlangTahun extends Command
{
    /**
     * The name and signature of the console command.
     *
     * @var string
     */
    protected $signature = 'command:name';

    /**
     * The console command description.
     *
     * @var string
     */
    protected $description = 'Command description';

    /**
     * Create a new command instance.
     *
     * @return void
     */
    public function __construct()
    {
        parent::__construct();
    }

    /**
     * Execute the console command.
     *
     * @return int
     */
    public function handle()
    {
        return Command::SUCCESS;
    }
}

Tahap selanjutnya adalah menamai command dan memberikan deskripsi. Anda dapat lakukan dengan mengedit baris berikut.

protected $signature = 'cmd-saya:ucapan-selamat-ultah';

protected $description = 'Mengirimkan Pesan Selamat Ulang Tahun';

Disini dapat anda lihat, saya mengganti signature dari command tersebut menjadi cmd-saya:ucapan-selamat-ultah. Sehingga apabila dipanggil nantinya akan menjadi php artisan cmd-saya:ucapan-selamat-ultah. Pada bagian description juga saya ganti, tujuannya untuk mendeskripsikan command tersebut agar lebih mudah mengetahui maksud dari command tersebut.

Selanjutnya, anda dapat berfokus ke fungsi handle(). Ini merupakan fungsi yang akan dipanggil ketika command tersebut dijalankan. Sebagai contoh saya akan menggantinya seperti berikut:

public function handle()
{

	$user = User::get();
	
	// perintah untuk mengirim ucapan

	// tampilkan ke terminal
	echo 'Command Selamat Ultah';

	// log sebagai penanda command telah berjalan
	Log::info('Perintah Selamat Ulang Tahun Telah Berjalan');

	return Command::SUCCESS;
}

Dapat dilihat disana saya hanya melakukan get data user, kemudian anda dapat memasukan code yang sesuai dengan keiinginan anda. Pada bagian akhir, saya menambahkan Log agar kita dapat mengatahui command telah berjalan atau tidak.

Untuk percobaan menjalankan command tersebut, pertama anda masuk ke command prompt atau terminal, kemudian ketikan perintah:

php artisan

Setelah dijalankan, seharusnya command anda terdaftar pada artisan list sesuai signature dan description yang anda gunakan

Artisan Route List

Command tersebut langsung dapat anda jalankan dengan mengetikan perintah:

php artisan cmd-saya:ucapan-selamat-ultah

Output Command Selamat Ulang Tahun

Selanjutnya, apabila kita lihat log seharusnya akan tertulis log yang kita buat barusan. Buka file laravel.log pada /storage/logs/laravel.log

Log output command

Dari sini dapat kita ketahui bahwa command sudah berhasil dibuat dan sudah terdaftar di artisan command list. Nah tahap selanjutnya kita akan memasukan comand tersebut sebagai Task Schedule.

2. Pendaftaran ke Kernel

Tahap akan dilanjutkan dengan memasukan command tersebut ke Kernel. Tujuannya agar command ini dapat dipanggil oleh cron job sesuai waktu yang kita inginkan. Buka file app/Console/Kernel.php.

<?php

namespace App\Console;

use Illuminate\Console\Scheduling\Schedule;
use Illuminate\Foundation\Console\Kernel as ConsoleKernel;

class Kernel extends ConsoleKernel
{
    /**
     * The Artisan commands provided by your application.
     *
     * @var array
     */
    protected $commands = [
        //
    ];

    /**
     * Define the application's command schedule.
     *
     * @param  \Illuminate\Console\Scheduling\Schedule  $schedule
     * @return void
     */
    protected function schedule(Schedule $schedule)
    {
        
    }

    /**
     * Register the commands for the application.
     *
     * @return void
     */
    protected function commands()
    {
        $this->load(__DIR__.'/Commands');

        require base_path('routes/console.php');
    }
}

Untuk mendaftarkan command ke schedule anda bisa berfokus pada function schedule() dan memasukan command anda kedalamnya seperti berikut ini:

protected function schedule(Schedule $schedule)
{
	$schedule->command('cmd-saya:ucapan-selamat-ultah')
					->dailyAt('01:00');
}

Penjelasan dari code diatas adalah sebagai berikut:

  1. $schedule->command('cmd-saya:ucapan-selamat-ultah') code ini bertujuan untuk memanggil command yang telah kita siapkan sebelumnya
  2. ->dailyAt('01:00'); selanjutnya code ini yang menentukan kapan command tersebut akan dipanggil. Code ini bermaksud bahwa command akan dipanggil setiap hari pada pukul 01:00. Anda juga dapat mengatur frekuensi kapan command akan dieksekusi dengan memasukan method lainnya. Daftar method yang tersedia dapat anda lihat pada halaman https://laravel.com/docs/8.x/scheduling#schedule-frequency-options

Pada fungsi schedule(), anda dapat daftarkan beberapa command dan waktu sesuai keperluan

protected function schedule(Schedule $schedule)
{
	$schedule->command('cmd-saya:ucapan-selamat-ultah')
            ->dailyAt('01:00');

	$schedule->command('cmd-saya:ucapan-selamat-tahun-baru')
            ->yearlyOn(1, 1, '00:00');

	$schedule->command('cmd-saya:ucapan-selamat-senin')
            ->mondays();
}

3. Mendaftarkan Schedule ke Cron Job

Tahap terakhir adalah mendaftarkan project Laravel anda ke cron job. Hal ini cukup anda lakukan sekali saja tiap project. Walaupun anda memiliki command tambahan, anda tidak perlu mendaftarkannya ulang.

Pada artikel ini, saya akan menyajikan cara untuk mendaftarkannya pada crontab linux. Masukan command berikut pada terminal.

crontab -e

Selanjutnya, masukan code berikut pada file tersebut

* * * * * php /directory/menuju/project/artisan schedule:run 1>> /dev/null 2>&1

#atau 

* * * * * cd /directory/menuju/project && php artisan schedule:run >> /dev/null 2>&1

Pada perintah pertama, bagian /directory/menuju/project/artisan dapat anda ganti dengan path project + artisan. Sebagai contoh apabila project anda berada pada directory /home/project/web-saya maka bagian tersebut anda ganti dengan /home/project/web-saya/artisan sehingga menjadi

* * * * * php /home/project/web-saya/artisan schedule:run 1>> /dev/null 2>&1

Atau untuk opsi yang kedua, bagian /directory/menuju/project anda ganti menjadi directory project sehingga menjadi

* * * * * cd /home/project/web-saya && php artisan schedule:run >> /dev/null 2>&1

Penutup

Nah sekian yang dapat saya sampaikan mengenai Task Schedule pada Laravel. Fitur ini sangat berguna untuk dipergunakan apabila anda menginginkan berjalannya suatu proses yang harus dilakukan secara terjadwal. Apabila anda memiliki kendala atau ada hal yang ingin ditanyakan, jangan sungkan untuk memasukannya pada kolom komentar dibawah. Terimakasi.

Tags:
PHP
Laravel
Task Scheduling
Artisan

Saya bisa membuatkan anda Aplikasi berkualitas

© 2021 Adisparta. All rights reserved.