Pada tutorial Laravel kali ini kita akan membahas salah satu ekosistem pada laravel yaitu bagaimana cara menggunakan Task Scheduling pada Laravel misalnya untuk membuat Cron Jobs.

Adapun ide dalam membuat artikel ini adalah saat saya menjumpai sebuah lowongan Laravel Back-End developer di FB, dimana disebutkan salah satu syaratnya adalah memahami deep ekosistem yang ada pada laravel salah satunya yaitu Laravel Task Scheduling.

Cron Jobs memungkinkan kita untuk dapat mengotomatisasi perintah dalam waktu tertentu, seperti misalnya dijalankan setiap seminggu, setiap hari, setiap jam, atau bahkan setiap menit.

Misalkan kita ingin selalu melakukan backup database aplikasi pada Laravel pada setiap seminggu sekali, atau sehari sekali, atau setiap menit sekali. Sehingga dengan membuat cron jobs kita tidak perlu repot untuk menjalankan perintah backup secara manual.

Menggunakan Task Scheduling Laravel kali ini, kita akan membahas membuat script yang dapat kita gunakan untuk melakukan backup database. Oke langsung saja cara menggunakan Task Scheduling pada Laravel untuk membuat cron jobs backup data langkahnya adalah sebagai berikut.

1. Membuat sebuah file command dengan perintah artisan.
Pertama buatlah sebuah file command dengan menjalankan perintah artisan berikut. Buka jendela Terminal/Command Prompt lalu pastikan aktif pada posisi project Laravel Anda.

php artisan make:command NamafileCommand

Misalkan file command saya beri nama BackupDB

Maka, perintah artisan yang kita jalankan diatas akan membuat sebuah file command pada folder “app/Console/Commands/NamafileCommand”.

Command Task Scheduling Laravel

2. Buka dan lakukan modifikasi pada file commmand yang berhasil kita buat, seperti berikut

protected $signature = ‘backup:database’;
protected $description = ‘Melakukan Backup Database’;

Lakukan modifikasi misalkan seperti diatas lalu simpan file command. Dengan begitu kita telah mendeskripsikan sebuah command yang dapat kita lihat melalui perintah artisan Laravel seperti berikut

php artisan list

Maka kita dapat menjumpai command yang kita buat diatas.

3. Menambahkan script yang akan kita gunakan untuk melakukan backup database pada baris function handle(), seperti berikut

$filename    = "backup-" . Carbon::now()->format('Y-m-d') . ".zip";$command     = "mysqldump --user=" . env('DB_USERNAME','root') ." --password=" . env('DB_PASSWORD') . " --host=" . env('DB_HOST') . " " . env('DB_DATABASE','larashop') . "  | gzip > " . storage_path() . "/app/backup/" . $filename;
$return      = NULL;
$output      = NULL;
exec($command, $output, $return);

Seperti berikut

<?php

namespace App\Console\Commands;

use Illuminate\Console\Command;
use Carbon\Carbon;

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

    /**
     * The console command description.
     *
     * @var string
     */
    protected $description = 'Melakukan Backup Database';

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

    /**
     * Execute the console command.
     *
     * @return int
     */
    public function handle()
    {
        $filename    = "backup-" . Carbon::now()->format('Y-m-d') . ".zip";$command     = "mysqldump --user=" . env('DB_USERNAME','root') ." --password=" . env('DB_PASSWORD') . " --host=" . env('DB_HOST') . " " . env('DB_DATABASE','larashop') . "  | gzip > " . storage_path() . "/app/backup/" . $filename;
        $return      = NULL;
        $output      = NULL;
        exec($command, $output, $return);
    }
}

Dengan begitu kita telah membuat fungsi backup database. Karena kita akan menyimpan hasil backup pada folder “storage\app\backup”, maka jangan lupa kita buat sebuah folder dengan nama “backup” pada folder “storage\app”.

4. Mendaftarkan nama command yang telah kita buat pada file Kernel.php Laravel pada folder “app\Console\Kernel.php”, lalu tambahkan script berikut

$schedule->command('backup:database')->everyMinute();
<?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)
    {
        // $schedule->command('inspire')->hourly();
        $schedule->command('backup:database')->everyMinute();
    }

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

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

Perintah everyMinute() bisa di ganti sesuai kebutuhan, Anda dapat melihat dokumentasinya di Laravel-Task-Scheduling.

5. Memastikan apakah command yang kita buat berjalan dengan baik, maka lakukan pengetesan dengan menjalankan command dengan perintah artisan berikut

php artisan backup:database

Jika semua berjalan dengan baik, maka akan kita jumpai file backup dengan format .zip yang terdapat pada folder “storage\app\backup”.

Command Task Scheduling Laravel

Nah diatas adalah cara kita menggunakan Task Scheduling Laravel untuk membuat fungsi backup database pada Laravel. Selanjutnya untuk menjalankan mengotomatisasi fungsi backup database yang telah kita buat diatas, maka kita dapat mendaftarkan pada crontab server project Anda.

Jalankan perintah

crontab -e

Lalu tuliskan potongan script berikut

* * * * * cd /path-to-your-project && php artisan schedule:run >> /dev/null 2>&1

Atau dapat membaca dokumentasi Laravel di https://laravel.com/docs/8.x/scheduling#scheduling-artisan-commands