Membuat Cron Job Task Schedule Pada Laravel – Saat kita sedang mendevelop sebuah aplikasi, terkadang kita perlu membuat sebuah task tertentu yang wajib dijalankan dalam kurun waktu tertentu..
Untung nya pada Laravel sudah terdapat fitur Schedule, jadi kita bisa dengan mudah membuat task2 schedule apa saja yang perlu dijalankan pada sistem tersebut dalam interval waktu yang sudah kita tentukan..
Cara Membuat Schedule
Untuk cara pembuat schedule sebetulnya sangat mudah sekali, kita hanya perlu membuat nya didalam file ../app/Console/Kernel.php..
Baca Juga : Cara Import Database MySql Berukuran Besar dengan BigDump..
Sebagai catatan, tutorial ini dibuat menggunakan Laravel versi 8.. Jika temen-temen menggunakan laravel versi berbeda, kemungkinan besar cara nya tetap sama..
Contoh pembuatan schedule sederhana
Sebagai contoh, saya ingin membuat schedule untuk menghapus table trash setiap hari nya, maka kita bisa membuat nya seperti berikut:
<?php namespace App\Console; use Illuminate\Console\Scheduling\Schedule; use Illuminate\Foundation\Console\Kernel as ConsoleKernel; use Illuminate\Support\Facades\DB; class Kernel extends ConsoleKernel { /** * Define the application's command schedule. * * @param \Illuminate\Console\Scheduling\Schedule $schedule * @return void */ protected function schedule(Schedule $schedule) { $schedule->call(function () { DB::table('trash')->delete(); })->daily(); } }
Perlu kalian perhatikan pada script diatas di baris ke-19, kita menggunakan perintah “$schedule->call” untuk membuat sebuah schedule baru..
Dan pada baris ke-21 terdapat perintah “->daily()” yang artinya kita akan menjalankan schedule tersebut pada setiap hari nya..
Interval waktunya bisa kita tentukan sendiri, laravel sendiri sudah menyediakan beberapa opsi interval waktu yang bisa kalian pilih sendiri sesuai dengan kebutuhan, selengkapnya ada dibagian bawah tutorial ini..
Menjalankan perintah artisan didalam Schedule
Kita juga bisa menjalankan perintah2 artisan kedalam schedule, sebagai contoh saya ingin ingin menjalankan perintah “php artisan optimize:clear” setiap 5 menit sekali, maka cara nya adalah seperti berikut:
.... protected function schedule(Schedule $schedule) { $schedule->command('optimize:clear')->everyFiveMinutes(); } ....
Mencegah Tumpang Tindih Tugas Schedule
Secara default, Task Schedule pada laravel akan terus dijalankan meskipun pada task yang sebelumnya masih berjalan..
Sebagai contoh, pada setiap menit kita membuat sebuah proses task scheduling tertentu, dan ternyata proses untuk menjalankan task tersebut lebih dari 1 menit, untuk mencegah tumpang tindih task, kita bisa menambahkan syntax withoutOverlapping()..
$schedule->command('emails:send')->withoutOverlapping();
Jadi dengan perintah ->withoutOverlapping(), sistem akan mengunci task tersebut agar tidak terjadi tumpang tindih..
Perintah ini wajib kamu pake kalo kamu ga tau seberapa lama proses task tersebut berjalan..
Memaksa Task Terus Berjalan Meskipun Dalam Mode Maintenance
Secara default, jika aplikasi laravel kita sedang berada dalama Maintenance Mode, maka seluruh Task Schedule yang sudah kita buat akan ikut terhenti..
Kalau kamu ingin task tersebut tetap berjalan, maka kamu perlu menambahkan perintah evenInMaintenanceMode() seperti pada contoh berikut:
$schedule->command('emails:send')->evenInMaintenanceMode();
Frekuensi / Interval Waktu Schedule nya
Laravel sendiri sudah menyiapkan Frekuensi / Interval waktu schedule yang sudah siap untuk kita gunakan..
Dengan beberapa opsi yang sudah disiapkan, ini semakin mempermudah kita dalam membuat task schedule..
->everyMinute(); |
Run the task every minute |
->everyTwoMinutes(); |
Run the task every two minutes |
->everyThreeMinutes(); |
Run the task every three minutes |
->everyFourMinutes(); |
Run the task every four minutes |
->everyFiveMinutes(); |
Run the task every five minutes |
->everyTenMinutes(); |
Run the task every ten minutes |
->everyFifteenMinutes(); |
Run the task every fifteen minutes |
->everyThirtyMinutes(); |
Run the task every thirty minutes |
->hourly(); |
Run the task every hour |
->hourlyAt(17); |
Run the task every hour at 17 minutes past the hour |
->everyTwoHours(); |
Run the task every two hours |
->everyThreeHours(); |
Run the task every three hours |
->everyFourHours(); |
Run the task every four hours |
->everySixHours(); |
Run the task every six hours |
->daily(); |
Run the task every day at midnight |
->dailyAt('13:00'); |
Run the task every day at 13:00 |
->twiceDaily(1, 13); |
Run the task daily at 1:00 & 13:00 |
->weekly(); |
Run the task every Sunday at 00:00 |
->weeklyOn(1, '8:00'); |
Run the task every week on Monday at 8:00 |
->monthly(); |
Run the task on the first day of every month at 00:00 |
->monthlyOn(4, '15:00'); |
Run the task every month on the 4th at 15:00 |
->twiceMonthly(1, 16, '13:00'); |
Run the task monthly on the 1st and 16th at 13:00 |
->lastDayOfMonth('15:00'); |
Run the task on the last day of the month at 15:00 |
->quarterly(); |
Run the task on the first day of every quarter at 00:00 |
->yearly(); |
Run the task on the first day of every year at 00:00 |
->yearlyOn(6, 1, '17:00'); |
Run the task every year on June 1st at 17:00 |
->timezone('America/New_York'); |
Set the timezone for the task |
Dengan banyaknya opsi yang sudah disiapkan, kamu tinggal pilih saja frekuensi waktu untuk menjalankan task tersebut..
Untuk informasi lebih lengkap nya bisa kalian kunjungi halaman resmi nya disini..
Cara menjalankan Task Schedule
Sekarang kita akan coba menjalankan testing task schedule nya apakah berhasil running atau tidak..
Disini saya akan menjalankan testing nya pada 2 server, yaitu di server lokal saya, dan juga di server hosting saya..
Pertama kita buat task schedule sederhana nya dulu seperti berikut:
<?php namespace App\Console; use Illuminate\Support\Facades\Log; 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->call(function () { Log::info('Task Schedule by sangcahaya.id at : ' . date('Y-m-d H:i:s')); })->everyMinute(); } /** * Register the commands for the application. * * @return void */ protected function commands() { $this->load(__DIR__ . '/Commands'); require base_path('routes/console.php'); } }
Coba kalian perhatikan pada baris ke-29, saya menulis sebuah task schedule yang didalam nya terdapat perintah untuk mencatat Log..
Dengan perintah ->everyMinute(), maka task schedule tersebut akan terus dijalankan pada setiap menit..
Menjalankan pada server lokal
Untuk menjalankan nya pada server lokal, kalian hanya perlu menjalankan perintah berikut:
php artisan schedule:work
Jika berhasil running, maka hasilnya seperti berikut:
Menjalankan Pada Server Hosting Dengan Cron Job
Untuk menjalankan Task Schedule pada server hosting tak semudah seperti kita menjalankan nya pada server lokal yang hanya menggunakan perintah artisan..
Kalo pada server hosting kita memerlukan sebuah cron job..
Jadi sekarang kalian buka dulu menu cron job pada akun cpanel kalian..
Kemudian silahkan buat cron job baru dengan ketentuan seperti berikut:
Pada bagian Common Settings, kalian wajib memilih once per minute..
Apa beda nya frekuensi waktu yg ada di cron job cpanel dengan frekuensi waktu yang ada di aplikasi laravel nya?
Kalau frekuensi waktu yang didalam aplikasi laravel kita adalah untuk menentukan jadwal waktu task schedule nya..
Sementara frekuensi waktu yang ada pada cron job cpanel nya digunakan untuk membaca file kernel.php nya, oleh karena itu wajib kita set once per minute agar kemungkinan tidak ada task yang terlewati..
Kemudian pada bagian inputan command kalian isi seperti berikut, kita mengarahkan nya kedalam file artisan:
/usr/local/bin/php /home/u8939843/aplikasi_laravel_ku/artisan schedule:run >> /dev/null 2>&1
Yang perlu kalian ubah adalah pada bagian “../home/u8939843/aplikasi_laravel_ku/artisan..”, silahkan kalian arahkan ke path folder aplikasi laravel nya..
Setelah cron job nya terpasang, kalian seharusnya sudah bisa melihat hasilnya, berikut adalah contoh hasil nya:
Pada gambar diatas menunjukkan bahwa fungsi dari cron job nya sudah berjalan..
Mudah bukan?
Support Us
Jika artikel ini bermanfaat untuk kamu, membantu menyelesaikan masalah yang sedang kamu hadapi, kamu juga bisa dukung kami dengan mengunjungi halaman berikut: https://saweria.co/sangcahayaid
Terima kasih..
[…] kita bisa gunakan sebuah library/package yang bernama spatie laravel-backup, yang dipadukan dengan cron job, maka kita bisa melakukan backup data secara otomatis tiap […]
[…] Untung nya mimin sudah pernah membahas nya, silahkan dibuka : Membuat Cron Job Task Schedule Pada Laravel. […]